in gotype/unfold_struct.go [125:149]
func makeFieldUnfolder(ctx *unfoldCtx, st reflect.StructField) (fieldUnfolder, error) {
fu := fieldUnfolder{offset: st.Offset}
targetType := reflect.PtrTo(st.Type)
if uu := lookupReflUser(ctx, targetType); uu != nil {
fu.initState = wrapReflUnfolder(st.Type, uu)
} else if targetType.Implements(tExpander) {
fu.initState = wrapReflUnfolder(st.Type, newExpanderInit())
} else if pu := lookupGoPtrUnfolder(st.Type); pu != nil {
fu.initState = pu.initState
} else {
ru, err := lookupReflUnfolder(ctx, targetType, false)
if err != nil {
return fu, err
}
if su, ok := ru.(*unfolderStruct); ok {
fu.initState = su.initStatePtr
} else {
fu.initState = wrapReflUnfolder(st.Type, ru)
}
}
return fu, nil
}