如何取消引用动态多级指针?

时间:2019-01-31 12:34:14

标签: go

我正在尝试实现一个功能,以使用反射和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
}

可以,但不能。

有什么办法解决这个问题?

3 个答案:

答案 0 :(得分:4)

使用反射,您可以这样做:

rt := reflect.ValueOf(i).Type()
for rt.Kind() == reflect.Ptr {
    rt = rt.Elem()
}

// rt is non-pointer type

https://play.golang.com/p/YbT1p4R3_1u

答案 1 :(得分:1)

使用以下内容间接访问值:

 v := reflect.ValueOf(i)
 for v.Kind() == reflect.Ptr && !v.IsNil() {
    v = v.Elem()
 }
 // v.Interface() is nil pointer or non-pointer

Run it on the Playground

答案 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)