基本介绍
Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
基本使用
定义结构体
结构体定义需要使用 type 和 struct 语句。
struct 语句定义一个新的数据类型,结构体中有一个或多个成员。
go
type Person struct {
Name string
Age int
}
结构体初始化
- 按照顺序给相对应的字段赋值
- 使用这种方式初始化结构体,必须初始化所有字段
go
p1 := Person{
"wuhenzhiyi1",
20,
}
fmt.Println(p1)
- 显示用字段名来赋值
- 使用这种方式初始化,可以省略某些字段,省略的字段默认是类型的零值
go
p2 := Person{
Name: "wuhenzhiyi2",
Age:20,
}
fmt.Println(p2)
一般来说我们都用第二种,更加清晰明了也不容易出错
访问结构体成员
我们可以用 . 来访问结构体的成员
go
fmt.Println(p1.Name) // wuhenzhiyi1
fmt.Println(p1.Age) // 20
fmt.Println(p2.Name) // wuhenzhiyi2
fmt.Println(p2.Age) // 20
结构体成员赋值
p1.Name = "wuhenzhiyi3"
fmt.Println(p1.Name) // wuhenzhiyi3
结构体方法
我们不仅可以给结构体设置成员,还可以给结构体设置方法,类似面向对象类的方法。
- 通过在方法前面写上需要接收的结构体类型,就可以给这个结构体设置一个方法。
- 访问结构体的方法也是通过 . 的方法
go
type Person struct {
Name string
Age int
}
func (p Person) say(){
fmt.Printf("my name is %s\n",p.Name)
}
func main(){
p1 := Person{
"wuhenzhiyi1",
20,
}
p1.say() // my name is wuhenzhiyi1
}
结构体嵌套
结构体里面还可以嵌套结构体类型,达到复用结构体的作用。
go
type Person struct {
Name string
Age int
Work Work
}
type Work struct {
Profession string
}
p3 := Person{
Name: "wuhenzhiyi2",
Age:20,
Work: Work{
Profession: "go",
},
}
fmt.Println(p3)//{wuhenzhiyi2 20 {go}}
fmt.Println(p3.Work.Profession) // go
注意事项
- 结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存。
- 结构体的所有字段在内存中是连续的。
- 使用 . 来访问结构体的成员变量,结构体成员变量的赋值与普通方法一致。
- 使用 new 关键字对类型进行实例化,创建指针类型的结构体。
- 取结构体的地址实例化,使用 &
- 匿名结构体没有类型名称,无须通过 type 关键字定义就可以直接使用