func NewUnfolder()

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
}