golang支援物件導向的設計,一般支援物件導向的語言都會有class的設計,但是golang沒有class關鍵字,只有struct結構體。通過結構體達到類的效果,這叫做大成若缺,其用不弊。
在使用struct之前,先介紹golang的乙個特性,golang允許使用者將型別a定義為另一種型別b,並為型別b新增方法。
1234
type integer intfunc (a integer) less (b integer) bool
我們將int定義為一種新的型別integer,integer就和int不是乙個型別了,這和c++不一樣。然後為integer新增了方法less,所有integer物件都可以使用less方法。類似於c++的成員函式。下面我們使用一下
12345
func main()
定義了兩個變數varint1和varint2,呼叫了varint1的less方法,輸出true
下面介紹struct的基本定義
12345
//建構函式和初始化type rect struct
定義了乙個結構體rect,rect包含四個成員,x,y為float64型別,width, height為float64型別。
下面為rect定義方法,計算矩形面積
123
func (r* rect) area() float64
golang結構體沒有public,private等字段,是通過成員的大小寫區分許可權的。大寫的結構體成員,別的包可以訪問,小寫的成員不可被別的包訪問。
rect的成員都為小寫,所以別的包無法訪問,但是可以通過定義大寫的方法,提供給別的包訪問
1234567
891011
1213
1415
1617
1819
func (r *rect) getx() float64func (r *rect) gety() float64
func (r *rect) area() float64
func (r *rect) getwidth() float64
func (r *rect) getheight() float64
這樣其他的包就可以通過rect的方法訪問rect內部變數值了。
結構體方法就好比是c++的成員函式,是類物件呼叫的方法。函式和結構體物件無關,可以自由編寫。
二者定義也有區別
1234567
func (this* 結構體型別) 方法名(方法引數列表) 方法返回值func 函式名(函式引數列表) 函式返回值
1234567
89
12345
定義變數呼叫方法
1234
列印結果如下
123
1234567
891011
1213
1415
1617
1819
2021
22
//匿名組合和派生type base struct
func (base *base) foo()
func (base *base) bar()
type foo struct
func (foo *foo) foo()
foo內部組合了base,但是並沒有顯示指定成員名,foo內部只寫了base型別,這叫做匿名組合,
匿名組合會在foo內部自動生成base同名的成員變數base,golang根據匿名組合,會認為foo繼承自base,
從而foo擁有base的方法和成員。下面寫**看看效果
1234567
891011
func main()//foo繼承base,所以擁有name屬性
foo.name = "foobase"
//foo 重寫(覆蓋)了base的foo
foo.foo()
//foo繼承了base的bar函式
foo.bar()
//顯示呼叫基類base的foo
foo.base.foo()
}
由於foo繼承base後重寫了foo方法,所以想要呼叫base的foo方法,需要顯示呼叫。
匿名組合如果是指標型別,在子類物件定義時需要顯示初始化基類指標,否則會出問題。
先定義匿名組合結構體
1234567
8910
//匿名指標組合type derivepoint struct
func (derivep *derivepoint) foo() bool
定義了derivepoint類,和方法foo,在foo內部列印了derivep的name,該name繼承自*base
下面呼叫
12
dr := &derivepoint}dr.foo()
輸出如下
12
this is derivepoint fooinherit base ,name is base
可見輸出了name值。
123456
//重複定義,因為匿名組合預設用型別做變數名type myjob struct
myjob匿名組合了logger類和log.logger類,由於匿名組合預設用型別做變數名,所以編譯器會認為定義了兩個logger名的成員,
從而報錯,所以匿名組合一定要注意這一點。
golang 支援多重繼承,實現多重繼承只需要多個匿名組合即可。
Golang結構體知識
在看docker原始碼時,碰到了這個語句 container.lock 看到上面直接對struct container進行上鎖時,我翻了一下這個結構體,發現沒有定義任何鎖啊,怎麼上鎖的咧。於是我就翻了一下這個結構 體的一些子屬性,發現了state的定義 container container.go ...
Golang 學習 結構體
結構體定義 結構體是一種資料型別。定義型別 地位等價於 int byte bool string.通常放在全域性位置 type person struct 注意 結構體內不能賦初值,不能用 var 修飾。普通變數定義和初始化 普通變數的賦值和使用 使用 索引成員變數。var man person m...
Golang結構體初探
go語言中的基礎資料型別可以表示一些事物的基本屬性,但是當我們想表達乙個事物的全部或部分屬性時,這時候再用單一的基本資料型別明顯就無法滿足需求了,go語言提供了一種自定義資料型別,可以封裝多個基本資料型別,這種資料型別叫結構體,英文名稱struct。也就是我們可以通過struct來定義自己的型別了。...