我正在编写一个程序,我需要访问一个以interface{}
传递的指针值。
package main
import (
"reflect"
)
type Test struct {
Names []string
}
func main() {
arr := []string{"a", "a", "a", "a", "a", "a"}
obj := new(Test)
obj.Names = arr
TestFunc(obj)
}
func TestFunc(obj interface{}){
rt := reflect.TypeOf(obj)
switch rt.Kind() {
case reflect.Struct:
return
case reflect.Ptr:
TestFunc(*obj) //<<--- There is the problem, cannot figure out how to access
//value of obj and *obj is not allowed here because of interface{} type.
}
}
这只是一个更大的程序的样本,但它足以解释我的问题。
所以问题是,当我将指针传递给TestFunc()
时,我不知道如何在函数内部达到它的值。有可能吗?
我需要做一些基于它是指针的东西,所以如果我继续递归地传递指针,程序将会失败。我需要从传递的指针获取值(并传递前向值而不是指针)但我不确定是否可能,因为我正在处理类型interface{}
而不是指针,编译器不知道是否它将成为一个指针传递,所以它不允许像“* obj”这样的东西达到它的值。
答案 0 :(得分:3)
如果需要支持任意级别的指针,那么可以使用反射来获取值对象:
v:=reflect.ValueOf(obj)
for v.Kind() == reflect.Ptr {
v = v.Elem()
}
v.Interface()
然而,实际上需要做的事情很不寻常。
对于你的功能,这可以像:
func TestFunc(obj interface{}){
rv := reflect.ValueOf(obj)
switch rv.Kind() {
case reflect.Struct:
// code here
return
case reflect.Ptr:
TestFunc(rv.Elm().Interface())
}
}