GO语言语法基础6 —— 结构体 | 青训营

77 阅读3分钟

结构体在Go语言中非常重要,用于组织和管理数据,提高代码的可读性和可维护性。

定义结构体

使用 type 关键字可以定义一个结构体类型。结构体类型由字段组成,每个字段都有一个名称和类型。

type Person struct {
    Name   string
    Age    int
    Gender string
}

上面的代码定义了一个名为 Person 的结构体类型,该结构体有三个字段:NameAgeGender。它们的类型分别是 stringintstring

创建结构体实例

创建结构体实例的方式有多种。可以通过使用结构体字面量,并为字段赋值来创建结构体实例。

person := Person{
    Name:   "张三",
    Age:    25,
    Gender: "男",
}

上述代码中,我们创建了一个名为 person 的结构体实例。通过在大括号内指定字段名和对应的值,我们为结构体的字段赋予了特定的值。

也可以按照字段顺序,直接为字段赋值。在这种情况下,需要注意确保赋值顺序与结构体类型定义的字段顺序一致。

person := Person{"张三", 25, "男"}

访问结构体字段

可以使用 . 操作符访问结构体实例中的字段。

fmt.Println("姓名:", person.Name)
fmt.Println("年龄:", person.Age)
fmt.Println("性别:", person.Gender)

上述代码中,我们通过 person.Nameperson.Ageperson.Gender 分别访问了结构体实例 person 中的字段值。

结构体嵌套

结构体可以嵌套在其他结构体中,形成复杂的数据结构。

type Address struct {
    City  string
    State string
}

type Person struct {
    Name    string
    Age     int
    Gender  string
    Address Address
}

上述代码中,我们定义了一个名为 Address 的结构体类型,表示地址信息。然后,在 Person 结构体中使用了嵌套结构体 Address,将地址信息作为 Person 的一个字段。

匿名结构体

可以创建没有命名的匿名结构体,这样的结构体只能在定义时直接使用,无法在其他地方再次引用。

person := struct {
    Name   string
    Age    int
    Gender string
}{
    Name:   "张三",
    Age:    25,
    Gender: "男",
}

上述代码中,我们创建了一个匿名结构体,并直接为其字段赋值。这种匿名结构体适用于临时存储少量数据的场景。

方法与接收者

在Go语言中,结构体还可以拥有方法。方法是与特定类型相关联的函数。我们可以为结构体定义方法,并通过使用接收者(Receiver)将方法关联到结构体类型上。

type Rectangle struct {
    Width  float64
    Height float64
}

// 计算矩形的面积
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

// 计算矩形的周长
func (r Rectangle) Perimeter() float64 {
    return 2 * (r.Width + r.Height)
}

上述代码定义了一个名为 Rectangle 的结构体类型,并为其定义了两个方法 Area()Perimeter()。这些方法的接收者是指向 Rectangle 结构体的值,并在方法内部使用该接收者来访问结构体字段。

使用结构体方法时,需要注意方法的接收者类型选择是值接收者(Value Receiver)还是指针接收者(Pointer Receiver)。对于只需要读取结构体字段值或不修改结构体的方法,可以选择值接收者;而对于需要修改结构体字段的方法,应该选择指针接收者,以便能够修改原始结构体的值。