回顧下slice和map他們都是單類型的數組
func main() { // 切片或者數組的類型只能存一種 s1 := []int{0, 1, 2, 3, 4, 5} // map也是一樣它的這個類型的值也只能是單類型的 m1 := map[string]string{"name": "eson", "addr": "hebei"} fmt.Println(s1, m1) }
那若是想存儲多種類型怎麼辦?使用結構體:structui
// Person struce save person property type Person struct { name string age int } func main() { p1 := Person{name: "eric", age: 18} fmt.Printf("%v\n", p1) }
總結下:spa
結構體是一組數據,它是一個複合類型(每一個數據有本身的類型)指針
除了標準的:字符串、數字、小數、布爾值咱們能夠經過type關鍵字自定義類型code
// PersonAge 自定義一個類型它有uint8的全部特性 type PersonAge uint8
類型別名go1.9版本以後的新功能內存
package main import "fmt" // NewAge 自定義類型 type NewAge uint // PersonAge go1.9以後引用了類型別名 // 類型別名規定:TypeAlias只是Type的別名,本質上TypeAlias與Type是同一個類型。 type PersonAge = uint8 func main() { var a1 NewAge var a2 PersonAge fmt.Printf("自定義類型: %T\n", a1) // 自定義類型: main.NewAge fmt.Printf("類型的別名: %T\n", a2) // 類型的別名: uint8 }
類型別名規定:TypeAlias只是Type的別名,本質上TypeAlias與Type是同一個類型。比如一我的自己有中文名字又啓用了一個英文名字,這個應爲名字指向也是同一我的字符串
區別:string
自定義類型是一個獨立的數據類型,可是類型別名他的類型仍是它指向的數據類型class
type 類型名 struct { 字段名 字段類型 字段名 字段類型 … }
解釋:import
type Person struct { name string age uint }
func main() { // 標準聲明方式 // 當咱們定義了一個變量後默認就使用了這個結構體的零值 var p1 Person fmt.Printf("%v\n", p1) p1.name = "eric" fmt.Printf("%v\n", p1) }
func main() { // p1 := new(Person) // 或者採用 p1 := &Person{} fmt.Printf("%v\n", p1) }
new或者取址符會返回一個指針類型的結構體,什麼使用指針類型的結構體呢?
實例化先聲明一個變量在賦值(沒有初始化實例化通常都會使用零值),初始化是在聲明的時候就賦值
package main import "fmt" type person struct { name string age int } func main() { // 鍵值對初始化 p1 := person{name: "eson", age: 18} // 列表初始化 p2 := person{"eric", 18} // 指針初始化(&或new) p3 := &person{name: "fire", age: 18} fmt.Printf("%v,%v,%v", p1, p2, p3) }
在一些須要臨時使用一個結構體的場景的時候,可使用匿名結構體
package main import "fmt" func main() { // 匿名結構體 var user struct { name string age int } user.name = "eson" user.age = 18 // user的類型是: struct { name string; age int } fmt.Printf("user的類型是: %T\n", user) // user的值:{eson 18} fmt.Printf("user的值:%v\n", user) }