Go 中的介面是如何實現的?
在檢查 Go 中的介面時,不同的視角可能會導致看似相反的理解。
方案表示
在「反射定律」一文中,介面值包含一個(值,型別)對。例如,將 io.Reader 指派給變數 r 會產生 r = (tty, *os.File)。這裡,tty 是值,而 *os.File 表示基礎值的類型。儘管 Read 方法有介面限制,但內部值保留了完整的類型資訊。
動態調度
相反,另一篇文章指出類型的 itable 實作具體介面方法。對於實作 Stringer 的 Binary 類型,其 itable 僅包含 String 方法。這意味著 itable 應該反映介面值的靜態類型,而不是底層值的類型。
澄清
這兩個觀點是相輔相成的。 「反射定律」檢查透過反射看到的介面值,提供簡化的表示。第二篇文章則聚焦在介面底層的動態調度機制,揭示具體實作方法的參與。
變數 r 的值確實包含 tty,並且具有靜態類型 io.Reader,它是一個包裝介面提供對 Read 方法的存取。然而,底層值 tty 保留其類型為 *os.File,包括 Read 以外的其他方法。
在 Go 中,介面是透過動態調度實現的,其中運行時根據具體情況解析調用哪個方法實現包裝值的類型。 itable 儲存每個介面方法的實作細節。
以上是## Go 中的介面是如何實現的:靜態類型還是動態調度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!