gpt4 book ai didi

go - 嵌入结构以覆盖方法

转载 作者:IT王子 更新时间:2023-10-29 02:27:49 26 4
gpt4 key购买 nike

TL;DR 请参阅底部的 playground 链接。

我在包含 ContextManager 结构上定义了方法。 Manager 是版本化的,允许新版本仅定义已更改的函数,如果未重新定义,则自动使用旧版本中的函数。

type Context struct { ... }

type Manager1 struct{
Context Context
}

type Manager2 struct {
Manager1
Context Context
}

当在 Manager2 上调用未在 Manager2 上定义的函数时,Context 为 nil。有没有办法在上下文可用的情况下执行此操作?

这个例子比我能解释的更能说明问题: http://play.golang.org/p/gFe6GgUKEJ

最佳答案

您滥用了嵌入。问题是,您已经在 Manager1 上定义了 Context,尽管您已经在每个后续类型上重新定义了它。在 Manager3 中,您正在为其 Context 实例设置值。当调用 Hello() 时,它在 Manager2 上定义并访问它的 Context 实例,该实例没有值。查看此示例以证明 http://play.golang.org/p/XebShA9ap4

金钱线是:m3 = Manager3{Manager2: Manager2{Context: Context{Value: "testing3"}}}

如您所见,如果我实例化嵌入在 Manager3 中的 Manager2 实例并设置它的 Context 值,它就会被打印出来。我建议更改您的类型,以便 Context 仅在 Manager1 上定义,然后在您初始化类型时使用类似于我的示例中的语法。

编辑:要将评论中讨论的设计写成书面形式,您需要将类型更改为此;

type Context struct {
Value string
}

type Manager1 struct {
Context Context
}

type Manager2 struct {
Manager1
}

type Manager3 struct {
Manager2
}

完全删除 Manager2 上的 Hello() 实现。然后将您的复合文字初始化更新为此;

m1 := Manager1{Context: Context{Value: "testing1"}}
m2 := Manager2{Manager1: Manager1{Context: Context{Value: "testing2"}}}
m3 := Manager3{Manager2: Manager2{Manager1: Manager1{Context: Context{Value: "testing3"}}}}

关于go - 嵌入结构以覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33378714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com