首頁  >  文章  >  後端開發  >  是否可以在 Go 中不嵌入 Properties 的情況下在 Node 結構中繼承 Properties 結構方法?

是否可以在 Go 中不嵌入 Properties 的情況下在 Node 結構中繼承 Properties 結構方法?

Patricia Arquette
Patricia Arquette原創
2024-10-31 04:49:02631瀏覽

Can Properties struct methods be inherited within the Node struct without embedding Properties in Go?

嵌入式結構

在 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 的提升方法。包含匿名欄位
    T,則S 和
  • S 的方法集都包含接收者T 或*T 的提升方法。節點內強制聲明屬性。
  • 結論
總之,雖然嵌入式結構體提供了一種方法繼承的方法,直接嵌入是 Go 中唯一可用的方法。規範禁止在沒有嵌入的情況下實現所需的行為。

以上是是否可以在 Go 中不嵌入 Properties 的情況下在 Node 結構中繼承 Properties 結構方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn