// From https://gist.github.com/imosquera/6716490#sthash.O4z2aQQp.LUHz2Cbb.dpuf package testutils import "reflect" // Restorer holds a function that can be used // to restore some previous state. type Restorer func() // Restore restores some previous state. func (r Restorer) Restore() { r() } // Patch sets the value pointed to by the given destination to the given // value, and returns a function to restore it to its original value. The // value must be assignable to the element type of the destination. func Patch(dest, value interface{}) Restorer { destv := reflect.ValueOf(dest).Elem() oldv := reflect.New(destv.Type()).Elem() oldv.Set(destv) valuev := reflect.ValueOf(value) if !valuev.IsValid() { // This isn't quite right when the destination type is not // nilable, but it's better than the complex alternative. valuev = reflect.Zero(destv.Type()) } destv.Set(valuev) return func() { destv.Set(oldv) } }