如何在 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
}
// ...
}
感谢其他答案,我从中窃取了最终解决方案。
我有这个功能:
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
}
// ...
}
感谢其他答案,我从中窃取了最终解决方案。