我正在尝试实现一个功能,以使用反射和DFS打印interface{}
的结构树。
但是我发现很难解除对多级指针的引用(NumField()
不能与指针一起使用)。就像:
func Tree(i interface{}) {
......
}
var a = 10
var b = &a
var c = &b
Tree(c)
我认为,也许:
for reflect.ValueOf(i).Kind() == reflect.Ptr {
t := i.(reflect.Typeof(i))
i = *t
}
可以,但不能。
有什么办法解决这个问题?
答案 0 :(得分:4)
使用反射,您可以这样做:
rt := reflect.ValueOf(i).Type()
for rt.Kind() == reflect.Ptr {
rt = rt.Elem()
}
// rt is non-pointer type
答案 1 :(得分:1)
使用以下内容间接访问值:
v := reflect.ValueOf(i)
for v.Kind() == reflect.Ptr && !v.IsNil() {
v = v.Elem()
}
// v.Interface() is nil pointer or non-pointer
答案 2 :(得分:0)
您正在寻找reflect.Indirect(interface{})
,
// Indirect returns the value that v points to.
// If v is a nil pointer, Indirect returns a zero Value.
// If v is not a pointer, Indirect returns v.
rv := reflect.Indirect(v)