回顾下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) }