返回信息流最近自学go语言,在继承这块遇到一点问题,其实和Java/c++中继承还是有区别的。其实就是一个嵌套类型,但是在外部类型调用内部类型的方法时有个疑问。
方法集提升的规则:
给定一个结构体类型 S 和一个命名为 T 的类型,方法提升像下面规定的这样被包含在结构体方法集中:
?如果 S 包含一个匿名字段 T,S 和 *S 的方法集都包含接受者为 T 的方法提升。
这条规则说的是当我们嵌入一个类型,嵌入类型的接受者为值类型的方法将被提升,可以被外部类型的值和指针调用。
?对于 *S 类型的方法集包含接受者为 *T 的方法提升
这条规则说的是当我们嵌入一个类型,可以被外部类型的指针调用的方法集只有嵌入类型的接受者为指针类型的方法集,也就是说,当外部类型使用指针调用内部类型的方法时,只有接受者为指针类型的内部类型方法集将被提升。
?如果 S 包含一个匿名字段 *T,S 和 *S 的方法集都包含接受者为 T 或者 *T 的方法提升
这条规则说的是当我们嵌入一个类型的指针,嵌入类型的接受者为值类型或指针类型的方法将被提升,可以被外部类型的值或者指针调用。
上面是我golang中文网上找到的关于继承后方法集提升的说明,但是
package main
import "fmt"
type person struct {
name string
}
func (p *person) ppointer(){
fmt.Println("this is person pointer func",p.name)
}
func(p person) pvalue(){
fmt.Println("this is person value func",p.name)
}
type student struct {
person
}
type teacher struct {
*person
}
func main() {
svalue := student{person{"1111"}}
svalue.ppointer()
svalue.pvalue()
//spointer := &student{person{"2222"}}
//spointer.ppointer()
//spointer.pvalue()
//
//tvalue := teacher{&person{"haha"}}
//tvalue.ppointer()
//tvalue.pvalue()
//
//tpointer := &teacher{&person{"啦啦"}}
//tpointer.ppointer()
//tpointer.pvalue()
}
但是这个程序可以正常运行,外部类型值可以直接调用内部类型的接收者为指针的方法,和上面的第一条规则冲突。我的go版本是最新版本12,有没有帮忙大神指点一下迷津,谢谢了。
这是一条镜像帖。来源:北邮人论坛 / java / #62062同步于 2019/5/21
Java机器人发帖
【问题】Go语言中继承方法集提升的问题
justlikeu
2019/5/21镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。