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结构体继承组合和匿名字段的更多相关文章

  1. go语言之进阶篇结构体指针类型匿名字段

    1.结构体指针类型匿名字段 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...

  2. [GO]结构体指针类型匿名字段

    package main import "fmt" type Person struct { name string sex byte age int } type Student ...

  3. Golang结构体struct的使用(结构体嵌套, 匿名结构体等)

    转自: https://studygolang.com/articles/11313 golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但 ...

  4. golang 结构体中的匿名接口

    golang 结构体中的匿名接口 代码示例 golang 中,可以给结构体增加匿名field,可参考 unknwon 大神的书. 匿名字段和内嵌结构体 但,golang同时也可以给结构体定义一个匿名i ...

  5. c语言结构体5之匿名结构体

    注意: 1匿名结构体不会出现重合 重命名的情况 2有名结构体 名称不能相同 也就是不能重名 //匿名结构体不会出现重名的情况 struct //无名结构体 { ]; ]; int num; };//不 ...

  6. golang之结构体结构体嵌入和匿名成员

    考虑一个二维的绘图程序,提供了一个各种图形的库,例如矩形.椭圆形.星形和轮形等几何形状.这里是其中两个的定义: type Circle struct { X, Y, Radius int } type ...

  7. golang 结构体嵌入和匿名成员

    考虑一个二维的绘图程序,提供了一个各种图形的库,例如矩形.椭圆形.星形和轮形等几 何形状.这里是其中两个的定义 type Circle struct { X, Y, Radius int } type ...

  8. go语言学习-结构体

    结构体 go语言中的结构体,是一种复合类型,有一组属性构成,这些属性被称为字段.结构体也是值类型,可以使用new来创建. 定义: type name struct { field1 type1 fie ...

  9. Go第六篇之结构体剖析

    Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类型可以被实例化,使用new或&a ...

随机推荐

  1. git理论知识

    1.Git 有三种状态,你的文件可能处于其中之一:已提交(committed).已修改(modified)和已暂存(staged) 由此引入 Git 项目的三个工作区域的概念:Git 仓库.工作目录以 ...

  2. peewee 对 mysql 类型支持问题,并不支持bit

    这个问题是当时想当然了 看到python BooleanField(default=False) 便认为 对应 mysql的bit 出现问题 mysql实际字段存储值为0,但 peewee orm 后 ...

  3. 经典题型-打印小星星(python)

    # * # * * # * * * # * * * * # * * * * * x = 0 while x < 5: x += 1 # 每次循环需要给y赋值0.清空y中存储的值 y = 0 wh ...

  4. DailyRollingFileAppender-设置文件大小和备份天数

    感谢:http://byx5185.iteye.com/blog/1616034 1.重写FileAppender : package com.bankht.cis.tps.apps.tps.util ...

  5. 吴裕雄--天生自然 R语言开发学习:中级绘图

    #------------------------------------------------------------------------------------# # R in Action ...

  6. 自研接口测试平台(Django2+Bootstrap3+Unittest)

    自研接口测试平台(Django2+Bootstrap3+Unittest) HttpRuleTest是一款面向 HTTP 协议的通用测试框架,只需web端维护接口测试数据,即可实现自动化测试.监控.数 ...

  7. 11. 无数人难办事? - 迪米特法则(LoD)

    11.1 第一天上班 时间: 4月2日19点   地点: 小菜大鸟住所的客厅   任务: 小菜, 大鸟      "回来啦! 怎么样? 第一天上班感受多吧." 大鸟关关心的问道.  ...

  8. kettle_errot_karafLifecycleListenter

    使用kettle 6.1 通过命令行批量执行作业的过程中,发现偶尔有作业执行时间会变慢几分钟,查看日志发现改作业开始就报了一个错 报错之后才会继续下面的作业,虽然不影响最终作业执行结果,但也延误了一些 ...

  9. WEB端缓存机制

    WEB端缓存机制 什么是WEB缓存 Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本.缓存会根据进来的请求保存输出内容的副本:当下一个请 ...

  10. 微软亚洲研究院的“哈利·波特”:Thomas Moscibroda

    在微软亚洲研究院,有一位名为Thomas Moscibroda的研究员几乎是无人不知.无人不晓,江湖人送外号"哈利·波特".Thomas认为他这么"红"是因为他 ...