Golang:调用嵌入类型的方法

Golang: calling methods of embedded types

提问人:Emanolo78 提问时间:7/8/2023 最后编辑:Emanolo78 更新时间:7/8/2023 访问量:49

问:

我正在使用 Golang 1.20 编译器,并且有一个与类型嵌入相关的奇怪行为,我不明白。

在一个名为 graphutil 的第一个包中,我创建了一个 Graph 类型结构,其中包含多个方法(例如 Graph.AddNode()):

软件包 “graphutil”:

type Graph struct {}

func (self *Graph) AddNode() {}

在另一个名为 neuronutil 的包中,我创建了一个图形的子结构,称为 NeuralNetwork:

软件包 “neuronutil”:

type NeuralNetwork struct {
  *graphutil.Graph
}

从理论上讲,我应该能够为神经网络定义一个可以调用 Graph 方法的方法,如下所示:

func (self NeuralNetwork) AddNeuron() {
 self.AddNode()
}

然而,编译器拒绝了这一点,它告诉我 NeuralNetwork 类型没有“AddNode”方法,尽管 NeuralNetwork 应该从 Graph 继承“AddNode”方法。当然,“neuronutil”包导入的是“graphutil”包。

奇怪的方面是:如果我创建一个主程序,它导入了“graphutil”和“neuronutil”库,我可以创建一个神经网络对象并从这个对象调用“AddNode”方法。下面的代码有效。

func main() {
testnode := graphutil.NewNode(0)
testneuralnetwork := neuronutil.NewNeuralNetwork("Test Neural Network")
testneuralnetwork.AddNode(testnode)
}

有谁明白为什么调用 Graph 结构的“AddNode”方法在 main 中有效,但在 neuronutil 库中不起作用?

以下是错误消息的屏幕截图:enter image description here

错误消息为:self。AddNode undefined(类型 NeuralNetwork 没有字段或方法 AddNode)compilerMissingFieldOrMethod)

Graph.AddNode() 方法确实存在。

Go 继承 方法 类型

评论

2赞 JimB 7/8/2023
Go 没有继承,不要尝试使用嵌入作为继承,否则只会导致混淆。您看到的错误到底是什么?委托给嵌入式方法编译得恰到好处:go.dev/play/p/T0wp_X84tTz
0赞 Emanolo78 7/8/2023
感谢您的回复。确切的设置比您发布的代码要复杂一些,后者确实可以编译。
2赞 JimB 7/8/2023
那么我们真的需要一个最小的可重现的例子,因为你所描述的是不可能的
1赞 JimB 7/8/2023
也许这只是编辑器的问题,你能从cli编译它吗?
0赞 Emanolo78 7/8/2023
确实,你是对的。代码编译。确实很奇怪的行为。谢谢你的帮助。

答: 暂无答案