Golang結構體初探

2021-10-10 17:34:11 字數 4548 閱讀 7537

go語言中的基礎資料型別可以表示一些事物的基本屬性,但是當我們想表達乙個事物的全部或部分屬性時,這時候再用單一的基本資料型別明顯就無法滿足需求了,go語言提供了一種自定義資料型別,可以封裝多個基本資料型別,這種資料型別叫結構體,英文名稱struct。 也就是我們可以通過struct來定義自己的型別了。

go語言中通過struct來實現物件導向的相關概念。

// 使用type和struct關鍵字來定義結構體

type 型別名 struct

結構體定義需注意

具體定義如下所示

type person struct

// 當有相同型別的時候,我們還可以將相同型別的變數名使用「,」分割,寫在一起。如下

type person1 struct

這樣我們就擁有了乙個的自定義型別person,它有namemaleage三個字段,分別表示姓名、性別和年齡。這樣我們使用這個person結構體就能夠很方便的在程式中表示和儲存人資訊了。

語言內建的基礎資料型別是用來描述乙個值的,而結構體是用來描述一組值的。比如乙個人有名字、年齡和性別等,本質上是一種聚合型的資料型別

將前面的融匯貫通,整點複合型的東東,搞起

type mystring string

type myint=

inttype person struct

結構體定義了之後,咱們還需要進行初始化,才能使用。

package main

import

"fmt"

type mystring string

type myint =

inttype person struct

type person1 struct

func

main()

type:main.person,value:

main.person

type:main.person1,value:

main.person1

通過以上示例我們知道,它是通過.,來乙個乙個的進行賦值

當然我們也是可以通過鍵值對對形式,從而進行批量賦值的,如下

p1 := person1

fmt.

printf

("type: %t, value:%#v"

, p1, p1)

匿名結構體

在定義一些臨時資料結構等場景下還可以使用匿名結構體。如下

package main

import

"fmt"

func

main()

person2.name =

"payne"

person2.age =

20 person2.*** =

"male"

fmt.

printf

("type:%t,value:%v\n"

, person2, person2)

fmt.

printf

("%#v\n"

, person2)

}// type:struct ,value:

// struct

通過使用new關鍵字堆結構體初始化,得到的是結構體的位址值

package main

import

"fmt"

type person3 struct

func

main()

既然是位址值,那麼我們也是可以使用&對他進行運算等操作的,相當於new

package main

type person3 struct

func

main()

p3.name =

"payne"

p3.gender =

"***"

p3.hobby =

string

p3.age =

20}

p3.name = "payne"其實在底層是(*p3).name = "payne",這是go語言幫我們實現的語法糖。

go語言的結構體沒有建構函式,我們可以自己實現。 例如,下方的**就實現了乙個person的建構函式。 因為struct是值型別,如果結構體比較複雜的話,值拷貝效能開銷會比較大,所以該建構函式返回的是結構體指標型別

借用結構體建構函式,實現的概念,如下

package main

import

"fmt"

type person5 struct

func

newclass

(name string

, age int

)*person5

}func

main()

go語言中的方法(method)是一種作用於特定型別變數的函式。這種特定型別變數叫做接收者(receiver)。接收者的概念就類似於其他語言中的this或者self

方法的定義格式如下:

func

(接收者變數 接收者型別) 方法名(引數列表)

(返回引數)

func

(誰能呼叫我?-接收者) 方法名(引數列表)

(返回型別)

其中,

舉個例子:

//person 結構體

type person struct

//newperson 建構函式

func

newperson

(name string

, age int8

)*person

}//dream person做夢的方法

func

(p person)

dream()

func

main()

方法與函式的區別是,函式不屬於任何型別,方法屬於特定的型別。

當方法作用於值型別接收者時,go語言會在**執行時將接收者的值複製乙份。在值型別接收者的方法中可以獲取接收者的成員值,但修改操作只是針對副本,無法修改接收者變數本身。

// setage2 設定p的年齡

// 使用值接收者

func

(p person)

setage2

(newage int8

)func

main()

指標型別的接收者由乙個結構體的指標組成,由於指標的特性,呼叫方法時修改接收者指標的任意成員變數,在方法結束後,修改都是有效的。這種方式就十分接近於其他語言中物件導向中的this或者self。 例如我們為person新增乙個setage方法,來修改例項變數的年齡。

// setage 設定p的年齡

// 使用指標接收者

func

(p *person)

setage

(newage int8

)

呼叫該方法:

func

main()

需要修改接收者中的值

接收者是拷貝代價比較大的大物件

保證一致性,如果有某個方法使用了指標接收者,那麼其他的方法也應該使用指標接收者。

go語言中使用結構體也可以實現其他程式語言中物件導向的繼承。

//animal 動物

type animal struct

func

(a *animal)

move()

//dog 狗

type dog struct

func

(d *dog)

wang()

func

main()

,}d1.

wang()

//aw會汪汪汪~

d1.move()

//aw會動!

}

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結構體和指標

golang是一門很特殊的語言,雖然它出生比較晚,但是在很多地方卻和現在的程式語言有所不同。現在的程式語言要麼是函式式的 要麼是物件導向的,而go語言卻有指標 結構體這些概念,並解決了c語言的一些坑。從這個角度上說,golang可以看做c語言的填坑加強版。定義結構體和c語言一樣,使用struct關鍵...