Go 中介面如何表示?
各種資源描述了 Go 中介面的表示,但有些可能看起來相互矛盾。本文旨在透過強調兩種此類資源之間的粒度差異來澄清混淆。
理解差異
標題為「反射定律」的文章重點介紹如何使用反射檢查物件的低階細節。它解釋了介面值包含一對(值,類型)。例如,以下程式碼中的變數 r 被描述為具有 (tty, *os.File) 對:
<code class="go">var r io.Reader tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0) if err != nil { return nil, err } r = tty</code>
另一方面,第二篇文章檢查了介面的動態調度屬性。它解釋了運行時根據與介面實作關聯的“itable”來解析介面方法。例如,在持有 Binary 類型的 Stringer 介面的圖中,itable 列出了用於滿足該介面 (String) 的方法,但沒有列出 Binary 類型實作的其他方法。
協調差異
這兩個資源在不同的抽象層級討論相同的概念。第一個討論反射的實現,第二個重點討論運行時行為。
在運行時,介面充當“包裝物件”,提供有關包裝物件的資訊以方便動態調度。這解釋了為什麼在第一個範例中呼叫 r 上的 Read 有效:它使用 itable 來定位 *os.File 類型中的 Read 函數實作。
總之,將介面理解為運行時“包裝物件”,它提供動態調度資訊。反射以(值,類型)對的形式提供了更高級別的表示。
以上是Go 中的介面如何運作:反射與執行時間行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!