许世伟的Go语言基础 第三章总结

第3章 面向对象编程

Go语言没有继承、虚函数、构造析构函数、this指针等。

3.1类型系统

类型系统:

  • 基础类型
  • 复合类型
  • 指向对象的任意类型Any
  • 值语义和引用语义
  • 面向对象
  • 接口

为类型添加方法

go可以为任何类型添加方法(包括内置类型,但不包括指针类型)。

go语言没有隐藏的this指针。也就是方法施加的对象显式传递,不需要非得是指针,也不用非得叫this。

&取地址,*取内容和表示指针。

当需要修改对象时,类方法必须用指针。

func (a *Integer) Add(b Integer){
    *a +=b
}
//不修改对象就不用加指针,保护数据但有内存开销。
func (a Integer) Add(b Integer){
  c := a+b
  fmt.Print(c)
}

值语义和引用语义

go语言大多数类型都是值语义。基本类型,以及数组、结构体、指针都是值语义。

对数组a,b=a是内容的完整复制,如想表达引用需使用指针var b=&a。

以下4个类型是引用类型:

  • 数组切片
  • map
  • channel
  • interface

channel和map本质上是一个指针,考虑到复制channel和map并不是常规要求,所以设计为引用类型而非统一的值类型。

初始化

go没有构造函数。对象创建由全局的创建函数执行(固定的NewXXX命名):

//创建Rect对象,注意结构体是值语义,返回值需取址转成指针。
func NewRect(x,y,width,height float64) *Rect{
  return &Rect{x,y,width,height}
}

匿名组合

go调用类成员的类方法,相当于调用父类的方法。没有继承重写的概念。

type Base struct{}
type Foo struct{
    Base
}
func (foo *Foo) Bar(){
  foo.Base.Bar()
}//相当于继承

指针方式从一个类派生:(匿名组合)

type Foo struct{
    *Base
}
var foo Foo
foo.Bar()
//匿名使用类成员的方法,可以当作继承用。
//构造时需要外部提供一个Base类实例的指针。

需要注意,无论匿名组合还是非匿名组合,调用的接收方并没有改变。被调用的Bar()方法不能访问Foo结构体中除Base结构体以外的其它方法。(缺点和问题)

对于命名冲突问题:

type X struct{
    Name string
}
type Y struct{
    X
    Name string
}
//Y对象只会访问到外层的Name变量,X.Name变量被隐藏起来了。

type Logger struct{}
type Y stuct{
    *Logger
    Name string
    *log.Logger
}
//重名的成员变量会导致编译错误,但如果不都使用,则编译器会忽略这个错误。

可见性

大写包外可见。

go的访问性是包一级而不是类型一级的,类方法也可以被同包的其它类使用。

接口

侵入式接口:实现类需要声明自己实现了某个接口。

go语言是非侵入式接口:只要实现了接口要求的所有函数,就是实现了接口。因百不必关心以下问题:

  • 两个类实现了相同的接口,放在哪个包中才好。
  • 提供哪些接口。

意义:

  • go中,类的继承树并无意义,只需要知道类实现了哪些方法和每个方法的含义。
  • 实现与只需要关心:需要提供哪些方法。不必关注接口拆多细。
  • 不必为了实现接口而导入一个包。引入外部包意味着耦合。

接口赋值(重点)

定义一个接口和实现类:

type Integer int

func (a Integer) Less(b Integer)  bool{
        return a<b
}
func (a *Integer) Add(b Integer)  {
    *a += b
}

type LessAdder interface {
    Less(b Integer) bool
    Add(b Integer)
}

func main() {//无返回值不用写void
    var a Integer = 1
    var b LessAdder = &a
    var c LessAdder  = a//编译器报错,由于带有引用语义的方法
}

go语言根据

func (a Integer) Less(b Integer) bool

自动生成

func (a *Integer) Less(b Integer) bool{
  return (*a).Less(b)
}

这样*Integer类型即存在Less()方法,也存在Add()方法,满足LessAdder()接口。而另一方面,根据

func (a *Integer) Add(b Integer)

却无法生成

func (a Integer) Add(b Integer){
  (&a).Add(b)
}

生成函数不能改变外部参数,与用户预期不符。

对象赋值给接口:因而含有语义方法的接口,只能引用赋值。只含值语义方法的接口随意。

接口之间赋值:并不要求两个接口等价,只要包含被赋值接口的所有声明方法即可。

接口查询

由于if语句带有赋值,接口查询的代码要优雅得多。

var a X = 1
if b,ok := a.(Integer); ok{}//注意是接口查询,a只能是接口实例,而不能是结构体的实例。

用switch询问类型:(类型查询)

var v1 interface{} = ...
switch v := v1.(type){
  case int:
  case string:
}

是的,利用反射也可以进行类型查询,详情可参阅reflect.TypeOf()方法的相关文档。

接口组合

go语言的接口即可以写方法,也可以写其它接口。

type ReadWriter interface{
    Reader //Reader接口
    Writer //Writer接口
}

Any类型

空接口可以接受任意对象的实例:

var v1 interface{} = 1
var v2 interface{} = "abc"
var v3 interface{} = &v2

函数可以接受任意对象实例时,也可以声明为interface{}

func Printf(fmt string,args ...interface{})
func Println(args ...interface{})
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容