in gotype/unfold.go [152:188]
func (u *Unfolder) SetTarget(to interface{}) error {
ctx := &u.unfoldCtx
if to == nil {
// reset internal states on nil
u.unfolder.init(&unfolderNoTarget{})
u.value.init(reflect.Value{})
u.ptr.init()
u.key.init()
u.idx.init()
u.baseType.init()
u.valueBuffer.reset()
return nil
}
if ptr, u := lookupGoTypeUnfolder(to); u != nil {
u.initState(ctx, ptr)
return nil
}
t := reflect.TypeOf(to)
if t.Kind() != reflect.Ptr {
return errRequiresPointer
}
ru, err := lookupReflUnfolder(&u.unfoldCtx, t, true)
if err != nil {
return err
}
if ru != nil {
ru.initState(ctx, reflect.ValueOf(to))
return nil
}
return errUnsupported
}