代碼示例:
package main import "fmt" type Human struct { name string age int weight int } type Student struct { Human // 匿名字段,那么默認Student就包含了Human的所有字段 speciality string } func main() { // 我們初始化一個學生 mark := Student{Human{"Mark", 25, 120}, "Computer Science"} // 我們訪問相應的字段 fmt.Println("His name is ", mark.name) fmt.Println("His age is ", mark.age) fmt.Println("His weight is ", mark.weight) fmt.Println("His speciality is ", mark.speciality) // 修改對應的備注信息 mark.speciality = "AI" fmt.Println("Mark changed his speciality") fmt.Println("His speciality is ", mark.speciality) // 修改他的年齡信息 fmt.Println("Mark become old") mark.age = 46 fmt.Println("His age is", mark.age) // 修改他的體重信息 fmt.Println("Mark is not an athlet anymore") mark.weight += 60 fmt.Println("His weight is", mark.weight) mark.Human = Human{"aaa", 20, 123} mark.Human.age += 10 fmt.Println(mark) }
004.struct類型
1 type聲明新類型
1.1 type testInt func(int) bool // 聲明了一個函數類型
1.2 type person struct //聲明一個結構體類型
1.3 struct與array一樣是值類型,作為參數會copy完整數據; slice、map、channel等傳遞的是數據的內存地址
2 初始化
2.1 順序初始化
2.1.1 var p Person = Person{"aaa", 123}
2.2 指定參數初始化
2.2.1 p = Person{name: "test", age: 456}
2.3 new指針初始化
2.3.1 var pp *Person = new(Person)
3 匿名訪問
3.1 組合關系的struct可以直接通過被繼承字段訪問
3.2 也可以通過struct名稱訪問
3.3 struct不僅僅能夠將struct作為匿名字段、自定義類型、內置類型都可以作為匿名字段, 而且可以在相應的字段上面進行函數操作
3.4 允許我們去重載通過匿名字段繼承的一些字段, 當然如果我們想訪問重載后對應匿名類型里面的字段,可以通過匿名字段名來訪問