当前位置: 首页 > 面试题库 >

Golang嵌入式结构

葛驰
2023-03-14
问题内容

是否可以在不使用嵌入式结构的情况下继承类型的方法?

代码的第一个片段是将Property结构嵌入其中的工作代码,Node我可以在上调用node.GetString该方法Properties。我不喜欢的是,当我初始化时,Node我有(?)来初始化其中的Properties结构。有没有解决的办法?

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 struct {
    *Properties
}

func main() {
    allNodes := Nodes{"1": &Node{&Properties{"test": "foo"}}} // :'(
    singleNode := allNodes["1"]
    fmt.Println(singleNode.GetString("test"))
}

最终,我想做以下事情。where
Node是类型Properties和初始化位置,也不需要初始化Property结构。以下代码不起作用,但可能清楚我的目标是什么。

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")) // :D
}

我将添加更多使用Properties的方法的结构,这就是我要问的原因。如果只拥有Node,我将拥有Node可以完成的方法。但是,由于我将拥有比Node我发现的更多的东西,因此可以向所有嵌入的结构添加相同的方法,这是多余的Properties

我想确切的问题,我想使用Properties方法Node而不必初始化Properties


问题答案:

因此,您在这里遇到了Go的特质。嵌入是一种方法,它可以“提升”一个结构的方法以使其似乎存在于另一个结构上。尽管type Node Properties应该直观地了解这些Properties方法Node,但该语法的作用是继承其方法Node的内存布局,Properties而不是其所有方法的内存布局。

它没有解释为什么做出这种设计选择,但是Go
Spec
至少是特定的(如果干燥的话)。如果您完全按原样阅读它,没有任何解释,那么它是非常准确的:

接口类型的方法集是其接口。任何其他类型T的方法集都包含以接收者类型T声明的所有方法

GetString的接收器类型Properties不是not Node,认真地将规范解释为您是没有想象力的会计师。照这样说:

进一步的规则适用于包含匿名字段的结构,如有关结构类型的部分中所述。

如果xf是表示该字段或方法f的合法选择器,则将结构x中匿名字段的字段或方法f称为提升。

提升的字段的作用类似于结构的普通字段,只是它们不能用作结构的复合文字中的字段名称。

给定一个结构类型S和一个名为T的类型,在该方法的方法集中包括了以下改进的方法:

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

关于复合文字的这一行迫使您Properties在每次Node创建的内容中进行声明。

ps杰夫!



 类似资料:
  • 问题内容: 我有以下几种类型: 我可以使用use ,但是我 不能 使用 似乎可以嵌入语法,但是使用它无效吗? 问题答案: 嵌入式类型是(未命名的)字段,由不合格的类型名称引用。 规格:结构类型: 使用类型但没有显式字段名称声明的字段是 匿名字段 ,也称为 嵌入式 字段或该类型在结构中的嵌入。必须将嵌入式类型指定为类型名称或指向非接口类型名称的指针,并且本身不能为指针类型。 非限定类型名称充当字段名

  • 问题内容: 假设,我运行一个API,并且当用户在用户资源上发出GET请求时,我将以JSON的形式返回相关字段 如您所见,User中的Secret字段具有。这意味着在大多数操作中,我都不想返回。在这种情况下,响应将是 忽略该字段将不会返回该字段机密。 现在,我将打开一个我想返回秘密字段的管理员专用路由。但是,这将意味着复制User结构。 我当前的解决方案如下所示: 有没有一种方法可以将User嵌入a

  • 问题内容: 我正在尝试学习Go,并且在这里找到了很好的资源。 下面给出了有关方法重载的示例: 是否可以调用“基本”结构的(人类)方法,例如。sam.Human.SayHi()向下转换不起作用(因为没有正确的类型层次结构?) 问题答案: 您可以通过使用嵌入类型名称的名称调用父级成员来访问父级结构的嵌入结构。那是一个大嘴巴,所以可能更容易证明它。 产出

  • 问题内容: 我想解组结构定义为: 使用似乎只对使用的,而忽略了场:https://play.golang.org/p/WUBfzpheMl 我有一个笨拙的解决方案,我可以手动设置该字段,但是我想知道是否有人可以使用一种更清洁或更简单的方法来进行设置。 谢谢! 问题答案: 发生这种情况是因为嵌入在中。这意味着当json库调用unmarshaler时,它最终以on调用了。 因此,在内部,参数包含整个j

  • 问题内容: 我知道如何在同一包中的结构中嵌入其他结构,但是如何在其他包的结构中嵌入结构? dog.go main.go 当我运行main.go时,它告诉我一个错误: 问题答案: @simon_xia是正确的,看来您 可能 对Go有点陌生。 首先,欢迎来到社区!! 现在,请扩展一下他的评论… Go并未提供成员/方法的公共/私有范围,而是具有Exporting的概念。因此,如果要允许从另一个包访问方法

  • 我希望在使用neo4j数据库的应用程序中使用此结构。 在这里,我将在三个不同的服务器上部署我的应用程序,每个服务器都有自己的嵌入式neo4j数据库。 我希望所有数据库都自动同步。 它适合我的大数据应用程序吗? 我正在使用SpringDataNeo4j,如何在SDN中配置此结构。 我需要企业版的neo4j为此。 有没有其他可以使用的框架/技术? 我几乎完成了这样的结构 我的Web应用程序部署在 >