Как разыменовать динамический многоуровневый указатель? - PullRequest
0 голосов
/ 31 января 2019

Я пытался реализовать функцию для печати дерева структуры interface{} с отражением и DFS.

Но мне трудно разыменовать многоуровневый указатель (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 голосов
/ 31 января 2019

Используйте следующее для косвенного просмотра значений:

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

Запустите его на игровой площадке

0 голосов
/ 01 февраля 2019

Вы ищете 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)
0 голосов
/ 31 января 2019

Используя отражение, вы можете сделать это:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...