in gotype/unfold.go [100:137]
func NewUnfolder(to interface{}, opts ...UnfoldOption) (*Unfolder, error) {
O, err := applyUnfoldOpts(opts)
if err != nil {
return nil, err
}
u := &Unfolder{}
u.opts = options{tag: "struct"}
u.unfolder.init(&unfolderNoTarget{})
u.value.init(reflect.Value{})
u.ptr.init()
u.key.init()
u.idx.init()
u.baseType.init()
u.valueBuffer.init()
u.reg = newTypeUnfoldRegistry()
if O.unfoldFns != nil {
u.userReg = map[reflect.Type]reflUnfolder{}
for typ, unfolder := range O.unfoldFns {
u.userReg[typ] = unfolder
u.userReg[typ.Elem()] = unfolder // add non-pointer value for arrays/maps and other structs
}
}
// TODO: make allocation buffer size configurable
// u.buf.init(1024)
if to != nil {
err := u.SetTarget(to)
if err != nil {
return nil, err
}
}
return u, nil
}