go - 嵌入结构以覆盖方法

标签 go

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/

相关文章:

go - 如何区分空字符串和 map 中的任何内容

go - channel 僵局

go - 在 golang 中实现全局热键?

go - 解析 map 的 yaml 错误

go - 存储所有符合相同接口(interface)的类型的构造函数集合

json - 使用 json post 的 Golang 编码/解码 base64 不起作用

go - 垃圾收集器和延迟函数之间的冲突?

go - 如何在golang中切割uuid?

Golang 泛型 - 简单用例

json - 检查 JSON 是对象还是数组