如果它作为接口{}传递,则访问指针值

时间:2017-07-26 17:54:57

标签: pointers go interface

我正在编写一个程序,我需要访问一个以interface{}传递的指针值。

playground

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”这样的东西达到它的值。

1 个答案:

答案 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()) 
    }
}