嵌入式结构
在 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规范中,以下语句阐明了这种情况:
“接口类型的方法集是其接口。任何其他类型 T 的方法集由使用接收者类型 T 声明的所有方法组成。”
因此,接收者类型为 Properties 的 GetString 排除了 Node。
匿名字段的附加规范
该规范详细说明了匿名字段(如 Node 中的 Properties) ):
“提升的方法包含在结构体的方法集中,如下:
不幸的是,这会导致在每个节点内强制声明属性。
结论
总之,虽然嵌入式结构体提供了一种方法继承的方法,直接嵌入是 Go 中唯一可用的方法。规范禁止在没有嵌入的情况下实现所需的行为。
以上是是否可以在 Go 中不嵌入 Properties 的情况下在 Node 结构中继承 Properties 结构方法?的详细内容。更多信息请关注PHP中文网其他相关文章!