Go 語言中數組可以存儲同一類型的數據,但在結構體中我們可以爲不同項定義不同的數據類型。
結構體是由一系列具有相同類型或不同類型的數據構成的數據集合。
結構體表示一項記錄,比如保存圖書館的書籍記錄,每本書有以下屬性:
itle :標題
Author : 作者
Subject:
學科 ID:書籍ID
- 使用 type < Name > struct{ } 定義結構,名稱遵循可見性規則
type person struct {
Name string
Age int
}
func main() {
//可以使用字面值對結構進行初始化
a := person{
Name: "yang",
Age: 20,
}
//如果要訪問結構體成員,需要使用點號 . 操作符,
a.Age = 19
fmt.Println(a) //{yang 19}
}
- 結構是值類型,所以對結構進行傳遞的時候是值拷貝,不會影響本來的值
func main() {
a := person{
Name: "yang",
Age: 20,
}
fmt.Println(a) //{yang 20}
A(a)
fmt.Println(a) //{yang 20}
}
func A(per person) {
per.Age = 18
fmt.Println("A", per) //A {yang 18}
}
- 允許直接通過指針來讀寫結構成員,如果通過指針進行傳遞的話,本來的值就會被改變了
func main() {
a := &person{ //此時a是指向結構的指針
Name: "yang",
Age: 20,
}
a.Name = "yuanmie" //此時可以直接更改屬性,不需要用(*a.Name = "yuanmie")這樣用*取出指針指向的底層值
fmt.Println(a) //&{yuanmie 20}
A(a)
fmt.Println(a) //&{yuanmie 18}
}
func A(per *person) {
per.Age = 18
fmt.Println("A", per) //A &{yuanmie 18}
}
- 支持匿名結構,可用作成員或定義成員變量
func main() {
a := struct { //取地址的話直接&struct就可以
Name string
Age int
}{
Name: "xu",
Age: 18,
}
fmt.Println(a) //{xu 18}
}
- 匿名結構也可以嵌套在其他結構中
type person struct {
Name string
Age int
Contact struct { //注意Contact不是結構名,而是person結構的第三個屬性名
phone, city string
}
}
func main() {
a := person{Name: "xy", Age: 18}
a.Contact.phone = "12345678910"
a.Contact.city = "beijing"
fmt.Println(a) //{xy 18 {12345678910 beijing}}
}
- 相同類型的成員可進行直接拷貝賦值,支持 == 與 !=比較運算符,但不支持 > 或 <
type person struct {
Name string
Age int
}
func main() {
a := person{Name: "xy", Age: 18}
var b person
b = a
fmt.Println(b) //{xy 18}
fmt.Println(b == a) //true
}
- 支持匿名字段,本質上是定義了以某個類型名爲名稱的字段
type person struct {
string
int
}
func main() {
a := person{"xy", 18} //賦值的類型必須嚴格按照結構裏的類型順序
fmt.Println(a) //{xy 18}
}
- 嵌入結構作爲匿名字段看起來像繼承,但不是繼承
type human struct {
Sex int
}
type person struct {
human
Name string
Age int
}
type student struct {
human
Name string
Age int
}
func main() {
a := person{Name: "xy", Age: 18, human: human{Sex: 0}}
b := student{Name: "ym", Age: 20, human: human{Sex: 1}}
fmt.Println(a, b) //{{0} xy 18} {{1} ym 20}
a.Name = "xy2"
a.Age = 13
a.Sex = 1
fmt.Println(a, b) //{{1} xy2 13} {{1} ym 20}
}
- 嵌入結構和外層結構有同名字段時候:
type A struct {
B
Name string
}
type B struct {
Name string
}
func main() {
a := A{Name: "xy", B: B{Name: "ym"}}
fmt.Println(a) //{{ym} xy}
fmt.Println(a.Name) //xy
fmt.Println(a.B.Name) //ym
}