Go語言入門7-結構struct

Go 語言中數組可以存儲同一類型的數據,但在結構體中我們可以爲不同項定義不同的數據類型。

結構體是由一系列具有相同類型或不同類型的數據構成的數據集合
結構體表示一項記錄,比如保存圖書館的書籍記錄,每本書有以下屬性:
itle :標題
Author : 作者
Subject:
學科 ID:書籍ID

  1. 使用 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}
}
  1. 結構是值類型,所以對結構進行傳遞的時候是值拷貝,不會影響本來的值
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}
}
  1. 允許直接通過指針來讀寫結構成員,如果通過指針進行傳遞的話,本來的值就會被改變了
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}
}
  1. 支持匿名結構,可用作成員或定義成員變量
func main() {
	a := struct {	//取地址的話直接&struct就可以
		Name string
		Age  int
	}{
		Name: "xu",
		Age:  18,
	}
	fmt.Println(a) //{xu 18}
}
  1. 匿名結構也可以嵌套在其他結構中
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}}
}
  1. 相同類型的成員可進行直接拷貝賦值,支持 == 與 !=比較運算符,但不支持 > 或 <
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
}
  1. 支持匿名字段,本質上是定義了以某個類型名爲名稱的字段
type person struct {
	string
	int
}

func main() {
	a := person{"xy", 18}	//賦值的類型必須嚴格按照結構裏的類型順序
	fmt.Println(a)	//{xy 18}
}
  1. 嵌入結構作爲匿名字段看起來像繼承,但不是繼承
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}
}
  1. 嵌入結構和外層結構有同名字段時候:
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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章