前言
学习之前大家先思考一个问题–Go有对象?Go没对象,为什么呢?这个好难回答,不如换个问题:“You 为啥没对象?”
记得刚刚学c语言的时候,嗯,没有对象是很正常的。
学Java的时候,第一堂课,就是:“恭喜在座的各位,你们开始有对象了。”
Go没有对象?那还咋活!
没对象,又想要原来那种有对象的日子,怎么办?
好说好说,那就是假装自己有对象
于是啊,Go 没有继承,就找了干儿子当儿子。然后,表现出我有继承人。
下面给大家列举一个很有意思的例子
来自 [go语言中文社区–习惯研究所所长] https://studygolang.com/articles/22985
package main
// 1,养父类
type AdoptedFather struct {
}
// 2, 养父的遗产
func (af AdoptedFather) Show() {
// 关键字func表示这是一个函数,第二个参数是结构体类型和实例变量(这样一来Go就知道了这是一个为结构体定义的方法。),第三个是函数名称,第四个是函数返回值
println("I'm your Father! You succeeded in inheriting my legacy.")
}
// 3, 父类
type AdoptedChild struct {
AdoptedFather
}
func main() {
child := AdoptedChild{
} // 干儿子
child.Show() // 继承干爹的遗产
}
结果
I'm your Father! You succeeded in inheriting my legacy.
PS :看不太懂?没有关系通过下面几小节的学习再回过头来就看的明白了。
一个成熟的类,具备成员变量和成员函数,结构体本身就有成员变量,再给他绑定上成员函数,一拍大腿,成了,这就是个类,谁来也是个类。好吧好吧,开个玩笑,Go确实没有类,但是可以通过组合模式来体现类的特征。毕竟Go语言可是号称万物皆类型。
下面让我们进入正题
结构体的声明
结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。
type Employee struct {
ID int
Name string
Address string
DoB time.Time //若未初始化则表示UTC时间,公元1年,1月,1日,0时,0分,0秒
Position string
Salary int
ManagerID int
}
var dilbert Employee
dilbert.Name = "dilbert"
dilbert.Salary = 5000
fmt.Println(dilbert) // {0 dilbert 0001-01-01 00:00:00 +0000 UTC 5000 0}
除了.操作符我们还可以对成员取地址,然后通过指针访问
var dilbert Employee
dilbert.Name = "dilbert"
name := &dilbert.Name
*name = "new" + *name
fmt.Print