假设现在我们定义了一个接口I
,有两个方法Foo
,Bar
, 结构体Parent
实现了 Foo
,而Bar
作为抽象方法由子类实现,
示例代码如下:
package main
type I interface {
Foo()
Bar()
}
type Parent struct {
I
}
func (p *Parent) Foo() {
p.Bar()
}
type Child struct {
Parent
}
func (c *Child) Bar() {
fmt.Println("Child.Bar()")
}
func main() {
c := &Child{
Parent: Parent{},
}
c.I = c // 如果注释掉这几句会提示空指针异常
c.Foo()
}
输出如下:
Child.Bar()
问题:
1.上面的代码实现了类似Java
风格的抽象类,但是在main
方法中的这句代码没看懂c.I = c
,这句代码的本质是做了什么事情?为什么c.I = c
就会报空指针异常
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.