1 回答
TA贡献1784条经验 获得超9个赞
您必须自己编写代码,并进行反思。
这是一个演示函数,可打印您提供的输出:
package main
import (
"fmt"
"reflect"
"strconv"
)
type Example struct {
Foo string
Bar string
Baz struct{
A int
B string
}
Qux []string
}
func main() {
example := Example{Qux: []string{"a", "b"}}
t := reflect.ValueOf(example)
prefix := t.Type().Name()
fmt.Println(ToPathSlice(t, prefix, make([]string, 0)))
}
func ToPathSlice(t reflect.Value, name string, dst []string) []string {
switch t.Kind() {
case reflect.Ptr, reflect.Interface:
return ToPathSlice(t.Elem(), name, dst)
case reflect.Struct:
for i := 0; i < t.NumField(); i++ {
fname := t.Type().Field(i).Name
dst = ToPathSlice(t.Field(i), name+"."+fname, dst)
}
case reflect.Slice, reflect.Array:
for i := 0; i < t.Len(); i++ {
dst = ToPathSlice(t.Index(i), name+"."+strconv.Itoa(i), dst)
}
default:
return append(dst, name)
}
return dst
}
将打印:
[Example.Foo Example.Bar Example.Baz.A Example.Baz.B Example.Qux.0 Example.Qux.1]
注意:
反射会带来性能损失;如果您对此感到担忧,您应该分析相关的代码路径以查看它是否会破坏交易
上面的代码是人为的,例如它不处理地图,它不处理
nil等等;你可以自己扩展它在您想要的输出中,将打印切片/数组字段的索引。切片没有数组的固有长度。为了知道切片的长度,您必须使用
reflect.Value. 这个 IMO 使代码更加尴尬。如果您可以接受不打印切片索引,那么您可以使用reflect.Type.
游乐场: https: //play.golang.org/p/isNFSfFiXOP
- 1 回答
- 0 关注
- 165 浏览
添加回答
举报
