Как разыменовать указатель динамически в Golang - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть это удовольствие c:

func getStringRepresentation(v interface{}, size int, brk bool, depth int) string {

    val := reflect.ValueOf(v)

    if val.Kind() == reflect.Ptr {
        v = *v.(types.Pointer)   // does not work
        val = reflect.ValueOf(v)
    }

   // ...

}

как я могу разыменовать указатель, чтобы получить его значение? Когда я использую:

v = *v.(types.Pointer)

Ошибка говорит:

Недопустимый косвенный для 'v. (Types.Pointer)' (type 'types.Pointer')

Я попробовал это:

val := reflect.ValueOf(v)

if val.Kind() == reflect.Ptr {
    v = v.(types.Pointer).Underlying()
    val = reflect.ValueOf(v)
}

и я тоже попробовал это:

val := reflect.ValueOf(v)

if val.Kind() == reflect.Ptr {
    v = val.Elem()
    val = reflect.ValueOf(v)
}

Мне нужно получить значение интерфейса {} из указателя.

Ответы [ 3 ]

2 голосов
/ 09 февраля 2020

Вы можете разыменовать указатели, используя отражение, используя Elem:

val := reflect.ValueOf(v)
if val.Kind() == reflect.Ptr {
   val = val.Elem()
}

После оператора if val - это reflect.Value, представляющее значение, переданное интерфейсом. Если переданное значение является указателем, val теперь имеет разыменованное значение этого указателя.

1 голос
/ 09 февраля 2020

Вы должны использовать 'Elem' для значения доступа, на которое ссылается Pointer.

package main

import (
    "fmt"
    "reflect"
)

func main() {

    p := &struct{Hello string}{"world"}
    v := reflect.ValueOf(p)
    ps := v.Interface().(*struct{Hello string})
    fmt.Println(ps)
    s := v.Elem().Interface().(struct{Hello string})
    fmt.Println(s)

}
0 голосов
/ 09 февраля 2020

Похоже, это завершилось тем, что я пытался сделать:

func getStringRepresentation(v interface{}, size int, brk bool, depth int) string {

    val := reflect.ValueOf(v)

    if val.Kind() == reflect.Ptr {
        v = val.Elem().Interface()  // gets the actual interface from the pointer
        val = reflect.ValueOf(v)    // gets the value of the actual interface
    }

   // ...

}

благодаря другим ответам, из которых я украл окончательное решение.

...