I use "reflect" and "unsafe" for doing de-serialization in a serialization framework,
and for cross-language work (Go <-> C, Go <-> scripting languages like Python, R, Lua, zygomys)[4][5][6].
If you are staying entirely within the Go language, then you aren't likely to need "reflect". It lets
you write very dynamic code to handle a Go struct whose layout you don't know about at compile
time. You give up type safety. It is usually alot of painstaking work.
If you aren't profiling your code for performance tuning, you likely won't need to mess with "unsafe".
It does let you avoid certain redundant allocations if you can guarantee things about your memory's
access patterns.
Since, as the ancient maps used to say, "here be dragons," it is better to leave both of them alone until you really, really need them.