Go笔记3:面向对象
Go是一个面向对象的语言,但是不同于Java,C++中略显复杂的面向对象思想,Golang 则将 OOP 思想做了极大的简化,只留下了最核心的特征:你可以给任何类型(包括内置类型)“增加”新方法。而在实现某个接口时,只需要实现该接口要求的所有方法即可。
接下来就是我对Go语言面向对象的特点一些总结。
对象
Golang中没有类似于Java中的Class对象,而是和C类似,通过结构体 struct 来实现的:
1 | type person struct { |
可以同下面几种方法来声明和初始化 struct 变量:
先声明,后赋值:
1
2
3var P person // P现在就是person类型的变量了
P.name = "zJun" // 赋值"Astaxie"给P的name属性
P.age = 25 // 赋值"25"给变量P的age属性按照顺序提供初始化值
1
P := person{"Tom", 25}
通过field:value的方式初始化,可以任意顺序
1
P := person{age:24, name:"Tom"}
通过new函数分配一个指针,此处P的类型为*person
1
P := new(person)
继承
Golang中继承是通过匿名变量实现的:
匿名字段,也称为嵌入字段 - 只提供类型,而不写字段名的变量。
当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。 比如下面的例子:
1 | type Human struct { |
方法
上面我们已经看到在Golang中可以通过 struct 来定义对象的属性(变量),但是还不能直接在 struct 中定义方法(method),下面我们就来看看如何在Golang中定义一个对象的方法:
定义
method的语法如下:
1 | func (r ReceiverType) funcName(parameters) (results) |
其中的 ReceiverType(接收者)如果是自定义的struct类型,那么这个方法就是struct的一个方法,可以通过下面的方式调用:
1 | r.funcName(param); |
方法的继承
和前面提到的一样,方法也可以通过匿名方法的方式进行继承:如果一个对象中有一个匿名字段实现了方法,那么在这个对象中也继承了这个方法,比如下面的例子:
1 | type Human struct { |
方法重写
Golang不支持方法的重载(override),但是可以对方法进行重写(overwrite),实现的方式也很简单:直接在子类中实现一个相同的方法。在调用时,会优先调用子类自己实现的方法,如果没有找到才会向上寻找调用父类(匿名变量)中的方法。
参考资料
- 标题: Go笔记3:面向对象
- 作者: zjun
- 创建于 : 2013-12-19 21:06:19
- 更新于 : 2023-11-30 15:41:14
- 链接: https://zjun.site/2013/12/5c556b8a284e.html
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。