TL;DR 请参阅底部的 playground 链接。
我在包含 Context
的 Manager
结构上定义了方法。 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/