1、 什么是结构体
一个事物会有许多种属性,我们用单一的数据类型已经无法描述事物了。go语言中提供了一种自定义数据类型,它可以封装事物的多个属性,这种数据类型就叫做结构体。它和java中的类是非常相似的。
2、 结构体的定义
定义结构体要使用关键字type
和struct
,具体格式如下:
// 格式
type 类型名 struct {
字段名 数据类型
字段名 数据类型
}
// 示例
type person struct {
name string
sex string
age int
}
- 类型名:表示自定义结构的名称,在同一个包内不能重复
- 字段名:表示结构体中字段的名称,字段名在结构体中是唯一的
- 数据类型:表示结构体字段的数据类型。数据类型可以是:基本数据类型、数组、引用类型
3、 结构体实例化
结构体只有实例化后才会分配内存,只有实例化后才能访问结构体中的字段。因为结构体也是一种数据类型,所以可以使用var
关键字来实例化结构体。在实例化后,会自动对结构体中的字段赋予零值。
3.1 基本格式
// 实例化结构体
var 结构体实例名 结构体类型
// 示例
var p person
3.2 匿名结构体
在一些场景下,我们可能需要用到临时的自定义结构体,这时候就可以用匿名结构体来实现
func main() {
// 匿名结构体
var user struct{name string; age int}
}
3.3 实例化指针类型结构体
结构体是值类型的数据类型,所以用new
关键字或者&
取地址操作来实例化一个结构体指针
// new实例化结构体指针格式
var 结构体指针名 = new(结构体类型名)
// 示例
var p1 = new(person)
fmt.Printf("类型:%T\n", p1) // *main.person
fmt.Printf("值:%#v\n", p1) // &main.person{name:"", sex:"", age:0}
// & 取地址符实例化结构体指针格式
var 结构体指针名 = &结构体类型名{初始化参数列表}
// 示例
var p2 = &person{}
fmt.Printf("类型:%T\n", p2) // *main.person
fmt.Printf("值:%#v\n", p2) // &main.person{name:"", sex:"", age:0}
4、结构体初始化
结构体实例化后字段就会有默认值了,基本数据类型为零值,引用类型为nil
。当然我们也可以手动对结构体作初始化,一种是使用键值对的方式,一种是值列表。
没有初始化时,字段默认为零值:
type person struct {
name string
city string
age int8
}
func main() {
var p4 person
fmt.Printf("p4=%#v\n", p4) //p4=main.person{name:"", city:"", age:0}
}
4.1 键值对方式初始化
格式:
结构体变量名 := 结构体类型 {
字段名: 字段值,
字段名: 字段值,
}
使用键值对对结构体初始化:
p1 := person {
name: "孙悟空",
sex: "男",
age: 500,
}
fmt.Printf("类型:%T\n", p1) // main.person
fmt.Printf("值:%#v\n", p1) // main.person{name:"孙悟空", sex:"男", age:500}
使用键值对对结构体指针初始化:
p2 := &person {
name: "观音菩萨",
sex: "女",
age: 500000,
}
fmt.Printf("类型:%T\n", p2) // *main.person
fmt.Printf("值:%#v\n", p2) // &main.person{name:"观音菩萨", sex:"女", age:500000}
4.2 值列表方式初始化结构体
p3 := person {
"唐僧",
"男",
10000,
}
fmt.Printf("类型:%T\n", p3) // main.person
fmt.Printf("值:%#v\n", p3) // main.person{name:"唐僧", sex:"男", age:10000}
注意点:
- 不管是键值对方式还是值列表方式,最后一个值后面都要加上
,
(逗号) - 值列表方式需要按顺序对每个字段的值初始化(按顺序、每个字段都要)
网友评论