go語言中的基礎資料型別可以表示一些事物的基本屬性,但是當我們想表達乙個事物的全部或部分屬性時,這時候再用單一的基本資料型別明顯就無法滿足需求了,go語言提供了一種自定義資料型別,可以封裝多個基本資料型別,這種資料型別叫結構體,英文名稱struct
。 也就是我們可以通過struct
來定義自己的型別了。
go語言中通過struct
來實現物件導向
的相關概念。
結構體定義需注意// 使用type和struct關鍵字來定義結構體
type 型別名 struct
具體定義如下所示
這樣我們就擁有了乙個的自定義型別type person struct
// 當有相同型別的時候,我們還可以將相同型別的變數名使用「,」分割,寫在一起。如下
type person1 struct
person
,它有name
、male
、age
三個字段,分別表示姓名、性別和年齡。這樣我們使用這個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}
go語言的結構體沒有建構函式,我們可以自己實現。 例如,下方的**就實現了乙個p3.name = "payne"
其實在底層是(*p3).name = "payne"
,這是go語言幫我們實現的語法糖。
person
的建構函式。 因為struct
是值型別,如果結構體比較複雜的話,值拷貝效能開銷會比較大,所以該建構函式返回的是結構體指標型別
借用結構體建構函式,實現類
的概念,如下
go語言中的package main
import
"fmt"
type person5 struct
func
newclass
(name string
, age int
)*person5
}func
main()
方法(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語言中使用結構體也可以實現其他程式語言中物件導向的繼承。
golang傳遞引數,永遠是拷貝。也就是說,在函式內部改變其值,僅僅在內部生效。若想在某一函式中改變其全域性的值。需要使用指標//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結構體知識
在看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關鍵...