嵌入式結構
在 Go 中,嵌入式結構提供了一種在結構之間重用方法的機制。然而,嘗試在不直接嵌入的情況下繼承方法時會出現某些限制。
詢問替代方法
使用者提問:是否可以繼承 Properties 結構體方法在 Node 結構中而不嵌入 Properties?提供的範例程式碼演示了嵌入式結構,導致需要關注 Node 內的初始化屬性。
解決關鍵問題
使用者的最終目標是將 Node 定義為Properties 結構體,消除了 Node 內初始化的需要。所需的程式碼類似以下:
<code class="go">package main import "fmt" type Properties map[string]interface{} func (p Properties) GetString(key string) string { return p[key].(string) } type Nodes map[string]*Node type Node Properties func main() { allNodes := Nodes{"1": &Node{"test": "foo"}} singleNode := allNodes["1"] fmt.Println(singleNode.GetString("test")) }</code>
了解Go 的設計選擇
但是,使用者會遇到Go 的一個特質:嵌入是提升方法的唯一方法從一個結構到另一個結構。雖然 Node 結構為 Properties 應該公開 Properties 方法似乎是合乎邏輯的,但語法為 Node 分配了 Properties 佈局,不包括方法。
檢查Go 的規範
引用Go規範中,以下語句闡明了這種情況:
「介面類型的方法集是其介面。
匿名欄位的附加規範此規範詳細說明了匿名欄位(如Node 中的Properties) ):
「提升的方法包含在結構體的方法集中,如下:
如果S 包含匿名欄位T,則S 和*S 的方法集都包含接收者T 的提升方法。包含匿名欄位以上是是否可以在 Go 中不嵌入 Properties 的情況下在 Node 結構中繼承 Properties 結構方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!