golang 07 結構體介紹

2022-01-23 12:29:45 字數 3297 閱讀 5955

golang支援物件導向的設計,一般支援物件導向的語言都會有class的設計,但是golang沒有class關鍵字,只有struct結構體。通過結構體達到類的效果,這叫做大成若缺,其用不弊。

在使用struct之前,先介紹golang的乙個特性,golang允許使用者將型別a定義為另一種型別b,並為型別b新增方法。

123

4

type integer int 

func (a integer) less (b integer) bool

我們將int定義為一種新的型別integer,integer就和int不是乙個型別了,這和c++不一樣。然後為integer新增了方法less,所有integer物件都可以使用less方法。類似於c++的成員函式。下面我們使用一下

123

45

func main() 

定義了兩個變數varint1和varint2,呼叫了varint1的less方法,輸出true

下面介紹struct的基本定義

123

45

//建構函式和初始化

type rect struct

定義了乙個結構體rect,rect包含四個成員,x,y為float64型別,width, height為float64型別。

下面為rect定義方法,計算矩形面積

123

func (r* rect) area() float64

golang結構體沒有public,private等字段,是通過成員的大小寫區分許可權的。大寫的結構體成員,別的包可以訪問,小寫的成員不可被別的包訪問。

rect的成員都為小寫,所以別的包無法訪問,但是可以通過定義大寫的方法,提供給別的包訪問

123

4567

891011

1213

1415

1617

1819

func (r *rect) getx() float64 

func (r *rect) gety() float64

func (r *rect) area() float64

func (r *rect) getwidth() float64

func (r *rect) getheight() float64

這樣其他的包就可以通過rect的方法訪問rect內部變數值了。

結構體方法就好比是c++的成員函式,是類物件呼叫的方法。函式和結構體物件無關,可以自由編寫。

二者定義也有區別

123

4567

func (this* 結構體型別) 方法名(方法引數列表) 方法返回值

func 函式名(函式引數列表) 函式返回值

123

4567

89

123

45

定義變數呼叫方法

123

4

列印結果如下

123

123

4567

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的方法和成員。下面寫**看看效果

123

4567

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方法,需要顯示呼叫。

匿名組合如果是指標型別,在子類物件定義時需要顯示初始化基類指標,否則會出問題。

先定義匿名組合結構體

123

4567

8910

//匿名指標組合

type derivepoint struct

func (derivep *derivepoint) foo() bool

定義了derivepoint類,和方法foo,在foo內部列印了derivep的name,該name繼承自*base

下面呼叫

1

2

dr := &derivepoint}

dr.foo()

輸出如下

1

2

this is derivepoint foo

inherit base ,name is base

可見輸出了name值。

123

456

//重複定義,因為匿名組合預設用型別做變數名

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來定義自己的型別了。...