func walkFields(v reflect.Value, visit func(field reflect.StructField, val reflect.Value, owner reflect.Type) bool) {
	t := v.Type()
	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)
		val := v.Field(i)
		expand := visit(field, val, t)
		if expand && field.Type.Kind() == reflect.Struct {
			walkFields(val, visit)
		}
	}
}
func walkFields(v reflect.Value, visit func(field reflect.StructField, val reflect.Value, owner reflect.Type) bool) {
	t := v.Type()
	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)
		val := v.Field(i)
		expand := visit(field, val, t)
		if expand && field.Type.Kind() == reflect.Struct {
			walkFields(val, visit)
		}
	}
}
func walkFields ( v reflect . Value , visit func ( field reflect . StructField , val reflect . Value , owner reflect . Type ) bool ) { t := v . Type ( ) for i := 0 ; i < t . NumField ( ) ; i ++ { field := t . Field ( i ) val := v . Field ( i ) expand := visit ( field , val , t ) if expand && field . Type . Kind ( ) == reflect . Struct { walkFields ( val , visit ) } } }
// walkFields calls a function for each field of a struct, recursively expanding struct fields.
walkFields calls a function for each field of a struct recursively expanding struct fields .