Go之面向对象编程之继承

Golang的继承与java和php不太一样,如php继承需要用到extends关键字,而Golang使用的是匿名继承或有名继承。

二:简单举例

1package main 2 3import ( 4 "fmt" 5) 6type Brand struct{ 7 Name string 8 9} 10 11type Goods struct{ 12 Brand 13 Goods_name string 14} 15 16func main() { 17 var extends Goods 18 extends.Brand.Name = "伊利" 19 extends.Goods_name= "纯牛奶" 20 fmt.Println(extends) 21} 22结果 23[ `go run extends.go` | done ] 24 {{伊利} 纯牛奶}

 继承的好处有,提高代码的复用性,程序的扩展和维护更加简单

三:继承的使用细节

①:结构体可以使用继承结构体的所有字段,无论首字母大写还是小写。

1package main 2 3import ( 4 "fmt" 5) 6type Person struct{ 7 Name string 8 age int 9} 10 11func (p Person) say() { 12 fmt.Printf("我的名字叫%v,今年%v岁", p.Name, p.age) 13} 14 15type Anna struct{ 16 Person 17 18} 19 20func main() { 21 var anna Anna 22 anna.Person.Name = "anna" 23 anna.Person.age = 18 24 anna.say() 25} 26结果 27[ `go run extends.go` | done ] 28 我的名字叫anna,今年18

 ②:匿名继承方法访问方式可以简化

 修改①中的例子,将访问方式简化

1func main() { 2 var anna Anna 3 anna.Name = "anna" 4 anna.age = 18 5 anna.say() 6}

 ③:当结构体和匿名结构体有相同字段时,结构体变量采用就近原则来方法字段,如果希望采用匿名的字段,使用详细访问方式即可

1package main 2 3import ( 4 "fmt" 5) 6type Person struct{ 7 Name string 8 age int 9} 10 11func (p Person) Say() { 12 fmt.Printf("我的名字叫%v,今年%v岁", p.Name, p.age) 13} 14 15type Anna struct{ 16 Person 17 age int 18} 19 20func (a Anna) AnnaSay() { 21 fmt.Printf("我今年%v岁", a.age) 22} 23 24func main() { 25 var anna Anna 26 anna.Name = "anna" 27 anna.age = 18 28 anna.Say() 29 fmt.Println() 30 anna.AnnaSay() 31} 32结果 33[ `go run extends.go` | done ] 34 我的名字叫anna,今年035 我今年18

 备注:anna访问的流程如下 先查找Anna结构体是否有需要的字段,有就是要Anna结构体,否则往Anna的匿名结构体Person上查找,找到就使用该结构体的字段,否则继续往Person的匿名结构体查找,直到按照就近原则找到为止,没找到就报错。

④:当有两个匿名结构体,且两个匿名结构体有相同的字段名称而结构体如Anna没有该形同字段时,必须指定匿名结构体名称,否则报错。

1package main 2 3import ( 4 // "fmt" 5) 6type Person struct{ 7 Name string 8 age int 9} 10 11type Animal struct{ 12 Name string 13 age int 14} 15 16type Anna struct{ 17 Person 18 Animal 19} 20 21func main() { 22 var anna Anna 23 //错误的写法 24 anna.age = 2 25 //正确的写法 26 anna.Person.age = 3 27 anna.Animal.age = 2 28}

 ⑤:结构体继承有名结构体时,这种方式就是组合,访问组合的字段时,必须带上结构体名称

1type Anna struct{ 2 p Person 3} 4 5func main() { 6 var anna Anna 7 anna.p.age = 2 8}

 在第④基础上修改。

⑥:在创建结构体变量时可以同时指定匿名结构体的字段值

1package main 2 3import ( 4 "fmt" 5) 6type Person struct{ 7 Name string 8 age int 9} 10 11 12type Anna struct{ 13 Person 14} 15 16func main() { 17 var anna Anna = Anna{Person{"anna",18}} 18 fmt.Println(anna) 19 var louis Anna = Anna{Person{ 20 Name : "louis", 21 age :18, 22 },} 23 fmt.Println(louis) 24} 25结果 26[ `go run extends.go` | done ] 27 {{anna 18}} 28 {{louis 18}}

 ⑦:多重继承,在第④中有举例,略。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )