30、Go 结构体 - 结构体的定义与使用
hi,我是温新
单一的数据类型已经无法满足开发的需求,Go 中提供了结构体来定义更为复杂的数据类型。结构体是由一系列相同类型或不同类型的数据构成的数据集合。
定义体的定义与实例化
定义结构体
结构体的定义方式如下,组成结构体类型的那些数据称为字段(fields)
,每个字段都有一个类型和一个名字,在一个结构体中,字段名字必须是唯一一。
type typeName struct {
field1 type1
field2 type2
...
}
使用结构体时需要注意如下 3 点:
1、typeName 是标识结构体的名称,在同一个包内不能重复;
2、结构体的 field 必须唯一;
3、同类型的 field 可以写在一行。
结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正分配内存。因此,只有在定义结构体并实例化后才能使用结构体。
实例化就是根据结构体定义的格式创建一份与格式一致的内存区域,结构体每个实例的内存是完全独立的。下面看看结构体的案例:
package main
// struct.go
func main() {
}
// 定义一个结构体
type Teacher struct {
name string
age int8
sex byte
}
实例化结构体
1、使用声明的方式实例化结构体
格式:var 自定义结构体名称 结构体名称
// struct.go
import "fmt"
func main() {
// 声明的方式实例化结构体
var t1 Teacher
fmt.Println(t1)
// 为字段赋值
t1.name = "王美丽"
t1.age = 19
t1.sex = 1
fmt.Println(t1)
}
2、变量简短声明格式实例化结构体
// struct.go main 函数中
t2 := Teacher{}
t2.name = "王大丽"
t2.age = 20
t2.sex = 1
fmt.Println(t2)
3、简短方式实例化并赋值
Go语言中可以通过键值对格式和列表格式对结构体进行初始化。格式如下:
结构体实例 := 结构体类型{
field1:值1,
filed2:值2,
}
// struct.go main 函数中
t3 := Teacher{
name: "美美",
age: 23,
sex: 1,
}
fmt.Println(t3)
4、new 函数实例化
// struct.go main 函数中
t4 := new(Teacher)
fmt.Println(t4) // &{ 0 0}
使用内置函数 new 实例化结构体,结构体实例化后形成指针类型的结构体,new 函数会分配内存。第一个参数是类型,返回值是指向该类型新分配的零值的指针。
5、取地址实例化
取地址实例化与使用new函数进行实例化类似,返回的是结构体指针类型。取地址实例化格式 如下:
// 格式
结构体实例 := &结构体类型{}
// struct.go main 函数中
t5 := &Teacher{}
fmt.Println(t5) // &{ 0 0}
结构体属性的访问
结构体实例化完成后,可通过“.”来访问结构体的成员变量,对成员变量进行赋值或修改。
package main
import "fmt"
func main() {
b := Book{
name: "Go",
}
fmt.Println(b.name)
}
type Book struct {
name string
}
请登录后再评论