Reflection should be all you need. This seems similar (though not identical) to "deep copy" semantics, which has been implemented at https://godoc.org/github.com/getlantern/deepcopy
You should be able to adapt that to your needs, or at least take some ideas from it.