basic
types and interfaces
interface 的底层结构:
- 具体的类型value(the concrete value):地址指向值信息
- 类型的描述( type descriptor/iTable):包含类型信息与方法集
- 所有的类型都实现了interface{}空接口,所有的赋值都可以被interface{}接受
图示
image.png
image.png
三大法则
概念说明:
- interface value:变量
- reflection object: reflect.Type,reflect.Value
- 转换关系: reflect.Value.Type() --> reflect.Type
三大法则:
- 反射可以从interface value 获取 reflection object。白话:未知类型变量 --> reflection.Type/reflection.Value。相关表现形式
reflect.TypeOf(varFloat64)
reflect.ValueOf(varFloat64)
reflect.ValueOf(varFloat64).Kind() == reflect.Float64
- 反射可以从 reflection object 获取 interface value。白话: reflection.Value --> interface{} --> type assertion(varInterface.(float64)) --> 想要的类型。相关例子:
- 获取原值:
v.Interface().(float64)
- 获取原值:
- 要修改一个reflection object,该类型必须能被改变(settable):
-
reflect.ValueOf(&varFloat64).Elem()
:只能原值为interface和指针类型,因为如果不是这两种类型,传递的都是复制的值。 -
reflect.Type.Elem() 得到 reflect.Type
: 获取复杂类型(Array, Chan, Map, Ptr, or Slice)的元素的类型。不是Array, Chan, Map, Ptr, or Slice,会panic。
-