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

还记得匿名字段吧,这里就相当于点出具体属性,调用具体属性的属性

一般匿名字段的方法是可以直接调用的,匿名字段名调用方法的时候是可以忽略字段名的,相当于是一个缩写形式

但是如果两个冲突字段深度不一样呢?那就是浅的覆盖深的属性

最新文章

  1. out和ref详解
  2. Atitit 深入理解抽象类与接口 attilax总结
  3. 正则表达式解析URL
  4. 解决webkit浏览器中js方法中使用window.event提示未定义的问题
  5. mongo virtual
  6. OpenLayers学习记录(1)
  7. lfs遇到的一些问题--后续阶段
  8. Navicat 选择语句
  9. pyVmomi入门
  10. svn branch 的使用
  11. Cesium 之简介以及离线部署运行篇
  12. 阿里云对象存储OSS与文件存储NAS的区别
  13. 关于表情的战争APP隐私政策网址
  14. strct配置文件详解
  15. hive 表新增字段后更新分区无法显示数据
  16. 浅谈 MongoDB
  17. MySQL索引的概念
  18. struts2之OGNL和struts2标签库和ValueStack对象
  19. 003-RHEL7-Linux系统维护管理命令使用
  20. KVM-Introduce

热门文章

  1. struts.xml中namespace的配置之浏览器兼容性
  2. Yii框架的学习指南(策码秀才篇)1-1 如何认识Yii framework
  3. python语法基础-函数-递归函数-长期维护
  4. django框架进阶-ModelForm组件-长期维护
  5. HDU-2544-最短路(各种最短路径算法)
  6. 使用 FreeMarker模板 Springboot 发送邮件
  7. java170道面试题汇总+详细解析
  8. Qt 添加Includes、Libraries库
  9. oracle存储过程随笔
  10. 最简化的DirectX 11开发环境的配置 VS2010