var的反射表示而不是接口。

时间:2016-06-11 23:04:59

标签: go

我试图理解反射值的表示:

type S struct {
    F string `species:"gopher" color:"blue"`
}

var x float64 = 3.4
v := reflect.ValueOf(x)     
fmt.Println("v = ", v)     // v = 3.4


s := S{}
ss := reflect.ValueOf(s)
fmt.Println("ss = ", ss)   // ss = {}   

据我所知,反射接口值的表示是一个双字对,它给出了一个指向类型信息的指针和一个指向相关值的指针。

变量的反射表示是什么。它只是值,如果是,那么类型如何由下面的代码确定:

fmt.Println("type:", reflect.TypeOf(x))

如果表示只是值,就像看起来那样,上面的代码在哪里找到类型信息?

1 个答案:

答案 0 :(得分:1)

reflect.TypeOf的类型是:

func TypeOf(i interface{}) Type

当您在代码中致电reflect.ValueOf(x)时,x的值会隐式转换为interface{}。在编译时,x的类型已知(float64),接口值表示为您已知的;作为一个双字对,带有指向float64信息的指针和指向float64值的指针(3.4)。

同样的推理适用于您的计划中的s

在Go中的类型之间进行了很少的隐式转换,但是在调用函数(或赋值给变量)时值和接口之间的转换是一个例外。