go的結構體是一種復合型別,它由一系列屬性(字段)組成,每個屬性(字段)都有自己的型別和值。結構體的字段可以是任何型別,甚至是結構體本身、函式、介面等
在go中沒有類的概念,因此結構體經常被用來替代物件導向中的類的操作
結構體的定義格式如下:
type structname struct
下面是乙個結構體的例項,首先定義了student
這一結構體,其中包含了name
和id
兩個屬性。在main
函式中建立了乙個student
的例項,並分別為它的兩個屬性賦值
type student struct
func
main()
s.id =
1 s.name =
"jay"
}
除了上面這種先建立後賦值的方式,也可以用下面的方式建立的同時為結構體的屬性賦值
func
main()
}
在結構體內嵌使用結構體型別的字段,如下面**所示,student
結構體中包括了乙個person
結構體型別的字段,訪問子結構體中的字段時需要一層一層巢狀呼叫s.p.***
struct person
struct student
func
main()
,}s.p.*** =
1}
go中支援匿名結構體的操作,即不需要事先定義宣告某個的結構體型別,而直接在用到的時候定義並賦值
func
main()
}
在結構體中使用匿名的方式定義結構體欄位:
type teacher struct
}func
main()
d.address.city =
"guangzhou"
d.address.stress =
"wushanroad"
}
在上面的**中,address
結構體沒有提前定義,而是在定義teacher
時定義的。要特別注意在這種結構中要對內部的結構體欄位進行賦值的話,不能在建立的時候賦值,只能在建立之後使用一層一層巢狀的訪問方式去賦值d.address.city = "guangzhou"
結構體中可以包括乙個或多個匿名字段,即這些字段沒有顯示的名字,只有欄位的型別,此時預設欄位的型別就是欄位的名字
type killer struct
func
main()
k.int
=222
k.string
="092"
}
同樣地,匿名字段可以是乙個結構體型別,即在結構體中可以巢狀匿名結構體欄位,這種形式叫做內嵌結構體。內嵌結構體有點類似於物件導向語言中的繼承行為,使用內嵌結構體,可以通過外部結構體直接訪問到內嵌結構體中的字段(類似於繼承了父類中的屬性),這一點要和上面的結構體中包含結構體字段時需要一層一層巢狀訪問的方式作區分
type person struct
type student struct
func
main()
,//預設結構名為變數名
} e.*** =
0//直接訪問內嵌結構體的字段
}
結構體要求欄位名稱要唯一,如果結構體中包含同名字段怎麼辦?(同名字段可能來自於「繼承」到內嵌結構體的字段)
在函式中傳入結構体作引數,同樣是值傳遞,在函式內修改結構體不會對原來的結構體有影響。如果確實需要在函式體內去修改結構體,有兩種方式:
func
pointtest
(s *student)
func
main()
pointtest
(&a)
}
func
pointtest
(s *student)
func
main()
pointtest
(b)}
特別要注意的是,如果採用第二種方式,當我們要訪問結構體的字段時,比如student
中的name
字段,直接使用b.name = "***"
即可,和你直接建立乙個結構體的訪問方式是相同的。go會幫我們自動轉換,非常方便,比較推薦 Go筆記 1 1 Go開發環境搭建
golang的學習開始,就是開發環境的搭建。我正在學習酷酷的 golang,可點此檢視帖子golang學習筆記彙總。在完成安裝包的安裝之後,你只需要配置 gopath這乙個環境變數就可以開始使用 go 語言進行開發了,其它的環境變數安裝包均會進行自動設定。在預設情況下,go 將會被安裝在目錄c go...
GO學習 11 Go語言基礎之map
go語言中提供的對映關係容器為map,其內部使用雜湊表 hash 實現。map是一種無序的基於key value的資料結構,go語言中的map是引用型別,必須初始化才能使用。go語言中map的定義語法如下 map keytype valuetype其中,map型別的變數預設初始值為nil,需要使用m...
Go 學習筆記 結構體
package main import fmt 結構體是由一系列具有一組相同或不同資料構成的資料集合,表達乙個整體概念。結構體定義 type struct variable type struct 宣告與初始化 variable name structure variable type 或 vari...