亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 中的接口是如何表示的?

Go 中的接口是如何表示的?

Go
MMTTMM 2021-09-21 17:41:00
> var r io.Readertty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0)if err != nil {? ? return nil, err}r = ttyr 示意性地包含 (value, type) 對 (tty, *os.File)。請注意,*os.File 類型實現了 Read 以外的方法;盡管接口值僅提供對 Read 方法的訪問,但內部的值攜帶有關該值的所有類型信息。另一篇文章說就我們的示例而言,Stringer 持有類型 Binary 的 itable 列出了用于滿足 Stringer 的方法,這只是 String:Binary 的其他方法 (Get) 在 itable 中沒有出現。感覺這兩個人是對立的。根據第二篇文章,第一個提取物中的變量 r 應該是 (tty, io.Reader),因為這是 r 的靜態類型。相反,文章說 *os.File 是 tty 的類型。如果第二個例子是正確的,那么第一個例子中的圖表應該包含由 Binary 類型實現的所有方法。我哪里錯了?
查看完整描述

2 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

這兩篇文章在兩個非常不同的粒度級別上解釋了一個類似的概念。正如沃爾克所說,“反射定律”是對通過反射檢查對象時實際發生的情況的基本概述。你的第二用品檢查的接口(其中,可通過反射以及解決)和運行時如何做出決議他們的動態調度性能在運行

根據第二篇文章,第一次提取中的變量 r 應該是 (tty, io.Reader)

鑒于這種理解,將運行時的接口視為“包裝器對象”。它的存在是為了提供有關另一個對象的信息(itable來自您的第二篇文章),以了解在包裝對象布局中跳轉到的位置(版本之間的實現可能有所不同......但對于大多數語言來說,原理基本相同)。

這就是調用Readonr有效的原因.. 首先它會檢查itable并跳轉到為該os.File類型布置的函數。如果那是一個接口 .. 你會看到另一個取消引用和調度(IIRC 在 Go 中根本不適用)。

RE:反射 - 你得到了一個很容易理解的表示,以一(value, type)對的形式(通過reflect.ValueOfreflect.TypeOf方法)。


查看完整回答
反對 回復 2021-09-21
?
明月笑刀無情

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 的?)所述不同。”


查看完整回答
反對 回復 2021-09-21
  • 2 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號