在 Go 中调用嵌入式类型的重载方法的正确方法
Proper way to call overloaded method of embedded type in Go
我有一个界面:
package pkg
type BaseInterface interface {
func Nifty() bool
func Other1()
func Other2()
...
func Other34123()
}
以及实现它的结构:
package pkg
type Impl struct {}
func (Impl) Nifty() bool { ... }
然后出现了另一个结构,它想要嵌入第一个并做它自己的 Nifty():
package myOtherPackage
import "pkg"
type ImplToo struct {
*pkg.Impl
}
func (it ImplToo) Nifty() bool { ... something else ... }
这有点像 class OOP 语言中带有方法覆盖的继承。我想知道如何做 implToo.super().Nifty() 的等价物 - 也就是说,从 ImplToo Nifty() 实现中调用 pkg.Impl Nifty() 实现。
在 it
上使用什么样的正确转换才能完成此操作?我尝试的每件事要么在 ImplToo 的 Nifty() 上产生无限递归,要么产生一些编译器错误,例如:
invalid type assertion: (&it).(BaseInterface) (non-interface type *it on left)
... 或许多变体。
您正在寻找;
type ImplToo struct {
pkg.Impl
}
func (it ImplToo) Nifty() bool { return it.Impl.Nifty() }
您对指针的使用不一致,这可能是您问题的一部分(不是肯定的)。如果你想让嵌入类型成为指针,那么让你的方法接收类型也成为指针以避免这个问题。
如果您想在嵌入式类型中显式使用方法,您可以使用通常具有 属性 名称的类型来引用它。
@evanmcdonnal 说的。你的 Nifty 要么需要接受指导,要么不需要。如果您将指针嵌入到 pkg.Impl
那么您的 Nifty 函数需要接受一个结构指针。如果你的 Nifty 函数不接受指针,那么你的嵌入类型不应该是指针。
这是一个有效的嵌入式指针。
·>猫main.go
package main
import (
"cs/pkg"
"fmt"
)
type ImplToo struct {
*pkg.Impl
}
func (it *ImplToo) Nifty() bool {
fmt.Printf("Impl.Nifty() is %t\n", it.Impl.Nifty())
return false
}
func main() {
i := new(ImplToo)
fmt.Println(i.Nifty())
}
·>猫cs/pkg/test.go
package pkg
type BaseInterface interface {
Nifty() bool
}
type Impl struct{}
func (i *Impl) Nifty() bool {
return true
}
输出:
Impl.Nifty() is true
false
我有一个界面:
package pkg
type BaseInterface interface {
func Nifty() bool
func Other1()
func Other2()
...
func Other34123()
}
以及实现它的结构:
package pkg
type Impl struct {}
func (Impl) Nifty() bool { ... }
然后出现了另一个结构,它想要嵌入第一个并做它自己的 Nifty():
package myOtherPackage
import "pkg"
type ImplToo struct {
*pkg.Impl
}
func (it ImplToo) Nifty() bool { ... something else ... }
这有点像 class OOP 语言中带有方法覆盖的继承。我想知道如何做 implToo.super().Nifty() 的等价物 - 也就是说,从 ImplToo Nifty() 实现中调用 pkg.Impl Nifty() 实现。
在 it
上使用什么样的正确转换才能完成此操作?我尝试的每件事要么在 ImplToo 的 Nifty() 上产生无限递归,要么产生一些编译器错误,例如:
invalid type assertion: (&it).(BaseInterface) (non-interface type *it on left)
... 或许多变体。
您正在寻找;
type ImplToo struct {
pkg.Impl
}
func (it ImplToo) Nifty() bool { return it.Impl.Nifty() }
您对指针的使用不一致,这可能是您问题的一部分(不是肯定的)。如果你想让嵌入类型成为指针,那么让你的方法接收类型也成为指针以避免这个问题。
如果您想在嵌入式类型中显式使用方法,您可以使用通常具有 属性 名称的类型来引用它。
@evanmcdonnal 说的。你的 Nifty 要么需要接受指导,要么不需要。如果您将指针嵌入到 pkg.Impl
那么您的 Nifty 函数需要接受一个结构指针。如果你的 Nifty 函数不接受指针,那么你的嵌入类型不应该是指针。
这是一个有效的嵌入式指针。
·>猫main.go
package main
import (
"cs/pkg"
"fmt"
)
type ImplToo struct {
*pkg.Impl
}
func (it *ImplToo) Nifty() bool {
fmt.Printf("Impl.Nifty() is %t\n", it.Impl.Nifty())
return false
}
func main() {
i := new(ImplToo)
fmt.Println(i.Nifty())
}
·>猫cs/pkg/test.go
package pkg
type BaseInterface interface {
Nifty() bool
}
type Impl struct{}
func (i *Impl) Nifty() bool {
return true
}
输出:
Impl.Nifty() is true
false