【发布时间】:2020-03-31 09:06:12
【问题描述】:
package main
type A interface {
GetName() string
}
type B struct {
A
}
func (this *B) Func1() {
this.GetName()
}
type C struct {
B
}
func (this *C) GetName() string {
return "hello"
}
func main() {
var c = new(C)
c.GetName()
c.Func1()
}
https://play.golang.org/p/1X7yiQeie8F
我的问题:
c.Func1() 将导致:
恐慌:运行时错误:无效的内存地址或 nil 指针取消引用
我的情况是:
用户需要实现A的一些基本接口,然后用户才能使用B的成员函数。希望复杂的代码封装到B的成员函数中,用户只需要提供基本信息即可。
如何实现这个目标?
【问题讨论】:
-
Haiving 创建了一个
C的实例,你永远不会分配给它嵌入的A,因此它保持在程序创建C实例时初始化的值——A类型的零值。任何接口类型的零值都是nil。尝试调用nil接收器上的方法会使您的程序崩溃。 -
您对问题的描述没有使用常见的 Go 术语,所以我觉得它很混乱。我不能确定你想要什么,但这可能是你想要的:play.golang.org/p/OuHUoEN3k8u。
-
看起来你可能试图在 Go 中重现典型的 OOP 设计,这将导致大量的挫败感和不可读的代码。例如,Go 中的接收者不应命名为
this。我建议放弃任何 OOP 概念,并使用 Go 成语重新思考您的设计。查看Effective Go 以获得良好的起点。 -
@leafbebop 非常感谢。这就是我想要的。
-
@Adrian 谢谢你的建议。我会仔细阅读
Effective Go。
标签: go inheritance interface encapsulation