go-by-test/walk/walk.go

37 lines
660 B
Go
Raw Normal View History

2024-09-18 16:15:01 +00:00
package walk
import (
"reflect"
)
func Walk(x interface{}, fn func(string)) {
2024-09-20 18:27:53 +00:00
val := getValue(x)
2024-09-20 18:19:49 +00:00
2024-09-20 18:36:24 +00:00
numberOfValues := 0
var getField func(int) reflect.Value
2024-09-20 18:32:37 +00:00
switch val.Kind() {
case reflect.String:
fn(val.String())
2024-09-20 18:36:24 +00:00
case reflect.Struct:
numberOfValues = val.NumField()
getField = val.Field
2024-09-20 18:37:54 +00:00
case reflect.Slice, reflect.Array:
2024-09-20 18:36:24 +00:00
numberOfValues = val.Len()
getField = val.Index
}
for i := 0; i < numberOfValues; i++ {
// XXX: Interface() to get interface
Walk(getField(i).Interface(), fn)
2024-09-20 17:59:39 +00:00
}
2024-09-18 16:15:01 +00:00
}
2024-09-20 18:27:53 +00:00
func getValue(x interface{}) reflect.Value {
val := reflect.ValueOf(x)
if val.Kind() == reflect.Pointer {
return val.Elem()
}
return val
}