go结构体继承组合和匿名字段
1、结构体方法
go不是纯粹的面向对象的,在go里面函数是一等公民,但是go也有结构体实现类似java一样类的功能来提供抽象。结构体的方法分为值方法和指针方法,前者在方法中做的改变不会改变调用的实例对象,后者则会改变,同样不管是值类型还是指针类型都是可以被调用的,因为go结构体底层会自动转化
比如下面是正常的调用:
type Stu struct {
name string
}
func (this Stu) SayName() {
log.Println(this.name)
}
s:=Stu{"Biningo"}
s.SayName()
如果再定义一个方法
func (this *Stu) ChangeName(name string) {
this.name = name
}
因为要改变,所以定义了一个指针类型方法,但是如下调用还是可以的
s:=Stu{"Biningo"}
s.ChangeName("xxx") // 会改变
s2:=&Stu{"Biningo"}
s2.ChangeName("xxxx") //会改变
s2.SayName() //会默认转化 相当于(*s2).SayName() xxxx
注意,go中是不允许方法重载的。同时不管是值类型方法还是指针类型方法名字也不允许一样
2、匿名属性和继承
继承:
type Camera struct {
name string
}
type Phone struct{}
func (p *Phone) Call() {
fmt.Println("打电话")
}
func (c *Camera) TakePicture() {
fmt.Println("拍照片")
}
type CameraPhone struct {
Camera
Phone
}
继承只需要结构体内嵌一个要继承的结构体就可以了,这样就可以直接使用父类的方法了
phone:=new(CameraPhone)
phone.Call()
phone.TakePicture()
匿名属性:
type CameraPhone struct {
Camera
Phone
int
}
我们加了一个int类型,这时候相当于加了一个名字为int,类型为int的属性,名字和类型名一样
可以如下使用:
phone:=new(CameraPhone)
phone.Call()
phone.TakePicture()
phone.int=1001
但是注意,匿名属性同类型只允许一个
那么我们允不允许继承组合一个借口类型呢?那当然也是可以的
下面看一种结构体和接口的组合并且实现多态:
type Clothe interface {
SayColor()
}
type BlueClothe struct {
Color string
}
func (b *BlueClothe) SayColor() {
log.Println("Blue")
}
type RedClothe struct {
Color string
}
func (b *RedClothe) SayColor() {
log.Println("Blue")
}
type Stu struct {
Clothe
Name string
}
func main() {
blue:=&BlueClothe{Color:"Blue"}
var stu Stu
stu.Clothe = blue //匿名类型名字就是类型名
stu.Name="biningo"
stu.SayColor()
}
3、结构体属性名称冲突
既然可以随意继承组合,并且可以直接由子类调用,那如果继承多个父类有相同的属性名怎么区分呢?如下:
type A struct {
a,b int
}
type B struct {
a int
}
上面定义了两个结构体,下面继承这两个结构体,注意这里a属性名字相同
type C struct {A;B}
如下解决冲突
c:=C{A{1,1},B{2}}
fmt.Println(c.A.a,c.B.a) //c.a报错 需要指明是A还是B的a
还记得匿名字段吧,这里就相当于点出具体属性,调用具体属性的属性
一般匿名字段的方法是可以直接调用的,匿名字段名调用方法的时候是可以忽略字段名的,相当于是一个缩写形式
但是如果两个冲突字段深度不一样呢?那就是浅的覆盖深的属性
go结构体继承组合和匿名字段的更多相关文章
- go语言之进阶篇结构体指针类型匿名字段
1.结构体指针类型匿名字段 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...
- [GO]结构体指针类型匿名字段
package main import "fmt" type Person struct { name string sex byte age int } type Student ...
- Golang结构体struct的使用(结构体嵌套, 匿名结构体等)
转自: https://studygolang.com/articles/11313 golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但 ...
- golang 结构体中的匿名接口
golang 结构体中的匿名接口 代码示例 golang 中,可以给结构体增加匿名field,可参考 unknwon 大神的书. 匿名字段和内嵌结构体 但,golang同时也可以给结构体定义一个匿名i ...
- c语言结构体5之匿名结构体
注意: 1匿名结构体不会出现重合 重命名的情况 2有名结构体 名称不能相同 也就是不能重名 //匿名结构体不会出现重名的情况 struct //无名结构体 { ]; ]; int num; };//不 ...
- golang之结构体结构体嵌入和匿名成员
考虑一个二维的绘图程序,提供了一个各种图形的库,例如矩形.椭圆形.星形和轮形等几何形状.这里是其中两个的定义: type Circle struct { X, Y, Radius int } type ...
- golang 结构体嵌入和匿名成员
考虑一个二维的绘图程序,提供了一个各种图形的库,例如矩形.椭圆形.星形和轮形等几 何形状.这里是其中两个的定义 type Circle struct { X, Y, Radius int } type ...
- go语言学习-结构体
结构体 go语言中的结构体,是一种复合类型,有一组属性构成,这些属性被称为字段.结构体也是值类型,可以使用new来创建. 定义: type name struct { field1 type1 fie ...
- Go第六篇之结构体剖析
Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类型可以被实例化,使用new或&a ...
随机推荐
- 1)session总结
(1)session的由来: HTTP协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系,最早,Netscape将cookie引入浏览器,使得数据可以客户端跨页面交换,那么服务器是如何记住众 ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习:对象 实例(3)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Anaconda 安装、TensorFlow 安装、pytorch 安装
问题 1 假设已经安装完Anaconda Navigator,按照 网址:https://www.zhihu.com/question/55577586 的教程操作,设置镜像源地址,安装. 问题 2: ...
- 双因子方差分析|adjusted R|强度|SSA|SSE|SST|
应用统计学 方差分析的基本假设: 组间组平均与总平均的不同是由treatment引发的.单个值与组平均的不同是由组内error引发的. 如果没有处理误差SSA=SSE,所以右尾假设如果F>1则处 ...
- OpenCV 基本的阈值操作
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #i ...
- 浏览器证书问题,chorm,ie,edge,safari都会去读系统证书,firefox例外
坑爹 没想过浏览器兼容的问题. 为系统安装用户证书后, firefox一直无法连接 提示 连接 www.httpsserver.com:8985 时发生错误. SSL 对等端无法协商出一个可接受的安全 ...
- Eclipse安装tomcat插件
安装插件:Pivotal tc Server Integration for Eclipse右击server可以定位到web项目部署的目录http://marketplace.eclipse.org/ ...
- Netflix拒上戛纳电影节,能给国内视频产业什么启示?
当新事物诞生时,总是会遭到质疑,甚至是排斥!因为新事物的活力.潜力,都对保守的传统事物产生了极大的冲击.就像有声电影刚刚诞生时,一代"默片大师"卓别林就对其进行了激烈的反对.他认为 ...
- DailyRollingFileAppender-设置文件大小和备份天数
感谢:http://byx5185.iteye.com/blog/1616034 1.重写FileAppender : package com.bankht.cis.tps.apps.tps.util ...
- Vuex安装使用
vuex是以插件的方式存在的. 安装:打开项目的根目录,即package.json所在目录,执行以下命令: npm install vuex --save-dev 背景:小型应用里的每个组件维护着自有 ...