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