這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
struct
我們可以聲明新的類型,作為其它類型的屬性或欄位容器。如,建立一個自訂類型person代表一個人的實體。這個實體擁有屬性:姓名&年齡。這樣的類型我們稱之為struct。
type person struct{ name string age int}
var P person // P 現在就是 person 類型的變數了P.name = "Astaxie" // 賦值 "Astaxie" 給 P 的 name 屬性 .P.age = 25 // 賦值 "25" 給變數 P 的 age 屬性fmt.Printf("The person's name is %s", P.name) // 訪問 P 的 name 屬性 .
除了上面這種P的聲明使用之外,還有其他兩種聲明使用方式1、按照順序提供初始化值
P := person{"Liuxinming", 28}
2、通過field:value的方式初始化,這樣可以任意順序
P := person{age:28, name:"Liuxinming"}
舉例:
package mainimport "fmt"//聲明一個新的類型type person struct {name stringavg int}//比較兩個人的年齡,返回年齡大的那個人,並且返回年齡差//struct 也是傳值的func older(p1, p2 person) (person, int) {if p1.avg > p2.avg { //比較p1和p2年齡return p1, p1.avg - p2.avg}return p2, p2.avg - p1.avg}func main() {var tom person//賦值初始化tom.name, tom.avg = "Tom", 18//兩個欄位都寫清楚的初始化bob := person{avg: 25, name: "Bob"}//按照struct定義順序初始化paul := person{"Paul", 43}tb_Older, tb_diff := older(tom, bob)tp_Older, tp_diff := older(tom, paul)bp_Older, bp_diff := older(bob, paul)fmt.Printf("Of %s and %s, %s is older by %d years\n",tom.name, bob.name, tb_Older.name, tb_diff)fmt.Printf("Of %s and %s, %s is older by %d years\n",tom.name, paul.name, tp_Older.name, tp_diff)fmt.Printf("Of %s and %s, %s is older by %d years\n",bob.name, paul.name, bp_Older.name, bp_diff)}
輸出結果如下:
Of Tom and Bob, Bob is older by 7 yearsOf Tom and Paul, Paul is older by 25 yearsOf Bob and Paul, Paul is older by 18 years
struct的匿名欄位
我們上面介紹了如何定義一個struct,定義的時候是欄位名與其類型一一對應,實際上Go支援只提供類型,而不寫欄位名的方式,也就是匿名欄位,也稱為嵌入欄位。當匿名欄位是一個struct的時候,那麼這個struct所擁有的全部欄位都被隱式地引入了當前定義的這個struct
// struct2.gopackage mainimport ("fmt")type Human struct {name stringage intweight int}type Student struct {Human //匿名欄位,那麼預設struct就包含了Human所有欄位speciality string}func main() {//初始化一個學生mark := Student{Human{"Mark", 25, 100}, "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 = 46fmt.Println("His age is", mark.age)// 修改他的體重資訊fmt.Println("Mark is not an athlet anymore")mark.weight += 60fmt.Println("His weight is", mark.weight)}
輸出結果:
His name is MarkHis age is 25His weight is 100His speciality is Computer ScienceMark changed his specialityHis speciality is AIMark become oldHis age is 46Mark is not an athlet anymoreHis weight is 160