2 回答

TA貢獻1798條經驗 獲得超3個贊
這兩篇文章在兩個非常不同的粒度級別上解釋了一個類似的概念。正如沃爾克所說,“反射定律”是對通過反射檢查對象時實際發生的情況的基本概述。你的第二用品檢查的接口(其中,可通過反射以及解決)和運行時如何做出決議他們的動態調度性能在運行。
根據第二篇文章,第一次提取中的變量 r 應該是 (tty, io.Reader)
鑒于這種理解,將運行時的接口視為“包裝器對象”。它的存在是為了提供有關另一個對象的信息(itable
來自您的第二篇文章),以了解在包裝對象布局中跳轉到的位置(版本之間的實現可能有所不同......但對于大多數語言來說,原理基本相同)。
這就是調用Read
onr
有效的原因.. 首先它會檢查itable
并跳轉到為該os.File
類型布置的函數。如果那是一個接口 .. 你會看到另一個取消引用和調度(IIRC 在 Go 中根本不適用)。
RE:反射 - 你得到了一個很容易理解的表示,以一(value, type)
對的形式(通過reflect.ValueOf
和reflect.TypeOf
方法)。

TA貢獻1828條經驗 獲得超4個贊
兩者都是正確的, r "holds" (tty, *os.File) 這就是第二篇文章所說的。請注意,反射法則更高級一些,并且沒有像第二篇文章中討論的那樣提及實現細節(可能會在每個版本中發生變化)。第二篇文章的示意圖如下:“s 包含示意性的 (b, *Binary)。s 是 Stringer 類型,它的數據是一個值為 200 的 Binary,s 的 itable 包含一個方法 String 和其他 Binary 方法(或*Binary) 未在 itable 中表示,因此無法被 s 訪問。
請注意,我認為 Go 1.4 中接口的實際實現與第二篇文章(Russ 的?)所述不同。”
- 2 回答
- 0 關注
- 190 瀏覽
添加回答
舉報