Golang的高級數據類型-結構體(struct)實戰篇
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
前面我們介紹了數組,切片,map同名都是用來保存相同的數據類型的,那如果我們想要一種數據類型保存不同類型的數據咋辦呢?Go語言在結構體中可以為不同項定義不同的數據類型。
一.定義結構體
package main import ( "fmt" ) /* 我們定義一個變量后不使用運行會報錯,但定義結構體類型后可以不使用,在執行時並不會報錯,因為你不對結構體進行初始化操作它並不占用內存空間. */ type Teacher struct { Name string Age uint8 } /* 溫馨提示: Go語言中結構體的字段首字母如果小寫的話不能跨包訪問,如果首字母大寫則可以跨包訪問. 如下所示,我們可以自定義一個全局類型的Student結構體類型 */ type Student struct { Name string Age uint8 Gender rune } func main() { //初始化一個結構體 var s1 Student s1.Name = "尹正傑" s1.Age = 18 fmt.Println("s1 = ", s1) //我們也可以在聲明變量的時候定義結構體類型,只不過我們實在main函數聲明的,因此是一個局部變量 var s2 struct { Name string Score int } s2.Name = "Jason Yin" s2.Score = 750 fmt.Println("s2 = ", s2) //我們可以直接進行初始化賦值 s3 := Student{Name: "Yinzhengjie", Age: 27, Gender: '男'} s4 := Student{"尹正傑", 27, '男'} //可以省略字段名稱但順序一定不能錯 fmt.Println("s3 = ", s3) fmt.Println("s4 = ", s4) }

二.結構體的基本使用
1>.結構體的訪問方式
package main import ( "fmt" ) /* 溫馨提示: (1)結構體中的字段一旦定義就不會發生改變; (2)結構體沒有增加或者刪除字段的操作; (3)在main函數中調用其它文件的成員,在編譯運行的時候,必須手動指定編譯的文件; */ type Person struct { Name string Age uint8 } func main() { //對自定義的結構體進行初始化賦值 s := Person{"尹正傑", 18} fmt.Println(s) //我們可以單獨訪問結構體的元素 fmt.Printf("姓名:%s,年齡:%d\n", s.Name, s.Age) }

2>.結構體和切片結合使用
package main import ( "fmt" ) type Operation struct { Name string Age uint8 } func main() { //使用自動推導類型直接進行初始化賦值 op := Operation{"尹正傑", 18} fmt.Println("op的數據為:", op) //定義一個結構體切片 var s1 []Operation //對結構體切片進行初始化 s1 = make([]Operation, 3) fmt.Print("s1結構體初始化值為:") fmt.Println(s1) //對結構體切片第二個元素進行賦值 s1[1] = op //我們可以對結構體切片的元素對應的屬性進行修改操作 s1[1].Name = "Jason Yin" fmt.Print("s1結構體被修改后的值為:") fmt.Println(s1) }

3>.結構體和字典(map)結合使用
package main import ( "fmt" ) type Server struct { brand string //品牌 CpuCore uint8 //核心數 MemorySpace int //內存空間,單位為GB DiskSpace int //磁盤空間,單位為GB } func main() { //使用自動推導類型直接進行初始化賦值 s1 := Server{"戴爾", 32, 128, 122880} //定義一個字典 m1 := make(map[string]Server) //結構體對象作為map的value m1["亦庄機房"] = s1 fmt.Println(m1["亦庄機房"].brand) fmt.Println(m1) /* 如果map的value是結構體類型,那么不能直接通過map修改結構體中的數據,這個時候結構體的內容是只讀的. 如果非要修改map的value是結構體類型,需要先對結構體進行修改,然后再重新賦值 */ //m1["亦庄機房"].brand = "浪潮" //這種寫法是錯誤的 s1.brand = "浪潮" //先修改s1結構體的brand字段 m1["亦庄機房"] = s1 //再對同一個key進行賦值,完成更新操作 fmt.Println(m1["亦庄機房"].brand) fmt.Println(m1) }

三.結構體對象作為函數參數傳遞
package main import "fmt" type Car struct { Name string color string tyre int8 } func Demo(c Car) { c.color = "紅色" fmt.Println("in Demo ...", c) } func main() { d1 := Car{"特斯拉", "藍色", 4} fmt.Println("in main ...", d1) /* 結構體對象作為函數參數,是值傳遞 */ Demo(d1) fmt.Println("in main ...", d1) }

