go 反射(三大原則)

basic

types and interfaces

interface 的底層結(jié)構(gòu):

  • 具體的類型value(the concrete value):地址指向值信息
  • 類型的描述( type descriptor/iTable):包含類型信息與方法集
  • 所有的類型都實現(xiàn)了interface{}空接口,所有的賦值都可以被interface{}接受

圖示

image.png
image.png

三大法則

概念說明:

  • interface value:變量
  • reflection object: reflect.Type,reflect.Value
    • 轉(zhuǎn)換關系: reflect.Value.Type() --> reflect.Type

三大法則:

  • 反射可以從interface value 獲取 reflection object。白話:未知類型變量 --> reflection.Type/reflection.Value。相關表現(xiàn)形式
    • 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。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容