30、Go 结构体 - 结构体的定义与使用

作者: 温新

分类: 【Go基础】

阅读: 587

时间: 2023-08-29 16:09:32

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
}
请登录后再评论