go-by-test/walk/walk.go
2024-09-20 20:27:53 +02:00

36 lines
604 B
Go

package walk
import (
"reflect"
)
func Walk(x interface{}, fn func(string)) {
val := getValue(x)
for i := 0; i < val.NumField(); i++ {
field := val.Field(i)
if val.Kind() == reflect.Slice {
for i := 0; i < val.Len(); i++ {
Walk(val.Index(i).Interface(), fn)
}
}
switch field.Kind() {
case reflect.String:
fn(field.String())
case reflect.Struct:
// XXX: Interface() to get interface
Walk(field.Interface(), fn)
}
}
}
func getValue(x interface{}) reflect.Value {
val := reflect.ValueOf(x)
if val.Kind() == reflect.Pointer {
return val.Elem()
}
return val
}