首页  >  文章  >  后端开发  >  是否可以在 Go 中不嵌入 Properties 的情况下在 Node 结构中继承 Properties 结构方法?

是否可以在 Go 中不嵌入 Properties 的情况下在 Node 结构中继承 Properties 结构方法?

Patricia Arquette
Patricia Arquette原创
2024-10-31 04:49:02624浏览

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规范中,以下语句阐明了这种情况:

“接口类型的方法集是其接口。任何其他类型 T 的方法集由使用接收者类型 T 声明的所有方法组成。”

因此,接收者类型为 Properties 的 GetString 排除了 Node。

匿名字段的附加规范

该规范详细说明了匿名字段(如 Node 中的 Properties) ):

“提升的方法包含在结构体的方法集中,如下:

  • 如果 S 包含匿名字段 T,则 S 和 *S 的方法集都包含接收者 T 的提升方法。
  • 如果 S 包含匿名字段 T,则 S 和 S 的方法集都包含接收者 T 或 *T 的提升方法。”

不幸的是,这会导致在每个节点内强制声明属性。

结论

总之,虽然嵌入式结构体提供了一种方法继承的方法,直接嵌入是 Go 中唯一可用的方法。规范禁止在没有嵌入的情况下实现所需的行为。

以上是是否可以在 Go 中不嵌入 Properties 的情况下在 Node 结构中继承 Properties 结构方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn