這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
目錄
-
- 結構
- 概念
- 建立結構
- 使用結構
- 值傳遞
- 匿名結構
- 結構的組合
摘要
定義結構,使用結構,值傳遞與指標傳遞,匿名結構,結構的組合
結構
概念
Go
中沒有 class
的概念,結構可以完成類似功能
- 支援指向自身的指標類型成員
- 支援匿名結構
- 支援
==
和 !=
運算子
建立結構
格式
type <Name> struct{}
type person struct { name string age int}
使用結構
結構變數的各個欄位都會有預設值
p1 := person{name: "Jack"}p1.name = "Peter" //p1 {Peter 0}
值傳遞
參數中的結構預設為值傳遞
p2 := person{name: "Jack", age: 20}changeAge(p2)func changeAge(p person) { p.age = 99 fmt.Println(p) //{Jack 99}}fmt.Println("p2", p2) //p2 {Jack 20}
可以通過使用指標改變原來的值
p2 := person{name: "Jack", age: 20}changeAge(p2)func changeAge2(p *person) { p.age = 99 fmt.Println(p) //&{Jack 99}}fmt.Println("p2", p2) //p2 {Jack 99}
也可以在定義時直接使用指標
p3 := &person{name: "Andy"}
匿名結構
建立匿名結構
p4 := struct { name string age int}
也可以在定義時直接進行初始化,但是初始化的最後不能少掉逗號
p4 := struct { name string age int}{ name: "Joe", age: 20, //不能少逗號}
結構中也可以包括匿名結構
type person struct { name string age int //匿名結構 address struct { street string }}
結構的組合
概念
由於 Go 沒有類和繼承的概念,所以要實作類別似功能,需要使用組合,即一個結構中包含另一個結構的變數
定義一個組合
type person struct { name string age int}type student struct { name string no int person}
以上在 student 結構中組合了一個 person 結構,預設 student 會產生一個與此結構相同的成員,且組合的成員會直接添加到外部結構中。
使用組合
stu := student{name: "Andy", no: 20, person: person{name: "Tony", age: 20}}stu.person.age = 21stu.age = 22fmt.Println(stu) //{Andy 20 {Tony 22 }}stu.name = "A"stu.person.name = "B"fmt.Println(stu) //{A 20 {B 22 {}}}
以上 stu.person.age
和 stu.age
實際操作的是同一變數,而 stu.person.name
和 stu.name
則為不同變數。
即,外部結構不具備內部結構的某一成員時,外部結構直接使用該成員實際使用的是內部結構的成員。
當外部結構和內部結構有同名的成員時,外部結構使用的外部結構的成員,內部結構使用的是內部結構的成員。