func intervoodoo(dst interface{}, src interface{}) error { dstVal := reflect.ValueOf(dst) srcVal := reflect.ValueOf(src)
if dstVal.Type().Kind() != reflect.Ptr { return fmt.Errorf("not a pointer") } if !dstVal.Elem().CanSet() { return fmt.Errorf("unsettable") }
// Dereference if srcVal.Type().Kind() == reflect.Ptr { srcVal = srcVal.Elem() } dstVal = dstVal.Elem()
if !srcVal.Type().AssignableTo(dstVal.Type()) { return fmt.Errorf("unassignable") }
dstVal.Set(srcVal)
return nil}