go 反射(三大原则)

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。

你可能感兴趣的:(go 反射(三大原则))