我从 Java 来到 Go,有些事情让我感到困惑。
例如,让我们考虑以下代码:
package main
import (
"fmt"
)
type I interface {
Do()
MegaDo()
}
type A struct {
}
func (a *A) Do() {
fmt.Println("A")
}
func (a *A) MegaDo() {
a.Do()
}
type B struct {
A
}
func (a *B) Do() {
fmt.Println("B")
}
var i I
func main() {
fmt.Println("Hello, playground")
var i I = &B{}
i.MegaDo()
}
这里我们有一个I
带有方法的接口Do()
和MegaDo()
. Struct在内部A
实现了方法和MegaDo
调用Do
。并且B
仅由覆盖A
和覆盖Do()
如果我在 Java 中模仿相同的代码,我希望它会打印“B”。但是在 Go 中它会打印“A”。
虽然我有点理解它为什么会发生(因为它是嵌入而不是继承),但我想知道如何在 Go 中模仿同样的事情。例如,我有两个相同接口的实现,它们只有一点不同。在这种情况下如何最大化代码重用?我不敢相信,为了在一个实现中自定义一点逻辑,我必须复制粘贴所有内容并修复我的代码中的一小部分。也许在 Go 中有一些惯用的方法可以做到这一点?