如何在 Golang 中动态取消引用指针

How to deref a pointer dynamically in Golang

我有这个功能:

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)

错误说:

Invalid indirect of '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)
}

我需要从指针获取接口{}的值。

您可以使用反射取消引用指针 Elem:

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

if语句后,val是一个reflect.Value代表接口传入的值。如果传入的值是指针,val 现在具有该指针的取消引用值。

您必须使用 'Elem' 访问指针引用的值。

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)

}

看起来这完成了我想做的事情:

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
    }

   // ...

}

感谢其他答案,我从中窃取了最终解决方案。