go十:面向对象之继承
在go中继承,叫匿名字段
1.匿名字段继承
package main import "fmt" type person struct { name string age int sex string } //结构体嵌套结构体,也可认为是继承 type Student struct { //通过匿名字段实现继承操作 person //结构体名称,作为另一个结构体的成员 id int score int } func main() { var stu Student stu.id = 101 stu.name = "张天" stu.score = 99 stu.sex = "男" fmt.Println(stu) //{{张天 0 男} 101 99} var st Student = Student{person{"张三慧", 200, "男"}, 102, 88} fmt.Println(st) //{{张三慧 200 男} 102 88} }
2.同名字段继承
package main import "fmt" type pers struct { name string age int sex string } type stud struct { pers id int name string score int } func main() { var stu stud //采用就近原则,使用子类信息 stu.name = "张三丰" stu.score = 90 stu.age = 999 fmt.Println(stu) //{{ 999 } 0 张三丰 90} //结构体变量.匿名字段.结构体成员 stu.pers.name = "张四丰" fmt.Println(stu) //{{张四丰 999 } 0 张三丰 90} var st stud = stud{pers{"张五慧", 99, "sex"}, 108, "张六慧", 99} fmt.Println(st) //{{张五慧 99 sex} 108 张六慧 99}
3.指针匿名字段
package main import "fmt" type per struct { name string age int sex string } type stu struct { *per //指针匿名字段 id int name string score int } func main() { var s1 stu s1.per = new(per) //指针类型的匿名字段,必须先new(父结构体) //或才将s1.per指向一个结构的指针 //var p = per{"杨过", 32, "男"} //s1.per = &p s1.name = "郭靖" s1.per.name = "郭靖靖" fmt.Println(s1) //{0xc0420601e0 0 郭靖 0} fmt.Println(s1.name, s1.per.name) //郭靖 郭靖靖 }
4.多重继承
继承方式一:多层次继承
package main import "fmt" type A struct { name string id int } type B struct { A sex string } type C struct { B score int } func main() { var s C s.name = "名字A" s.id =23 s.sex = "性别B" s.score = 99 fmt.Println(s) //{{{名字A 23} 性别B} 99} var ss C ss.score = 99 ss.B.sex = "BB" ss.B.A.name = "AA" fmt.Println(ss) //{{{AA 0} BB} 99} }
方式二:继承多个父类
package main import "fmt" type A struct { name string id int } type B struct { sex string } type C struct { A B score int } func main() { var s C s.name = "名字A" s.id =23 s.sex = "性别B" s.score = 99 fmt.Println(s) //{{名字A 23} {性别B} 99} var ss C ss.score = 99 ss.B.sex = "BB" ss.A.name = "AA" fmt.Println(ss) //{{AA 0} {BB} 99} }
posted on 2018-03-29 21:37 myworldworld 阅读(116) 评论(0) 收藏 举报