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 }