Golang 第四章 4.结构体

  • By v2ray节点

  • 2026-03-24 16:04:50

  • 评论


结构体是 一组字段(field)的集合,可以把相关的数据组合在一起。

类似 C 语言的 struct,也类似数据库的一行数据。



定义结构体

type Person struct {
    Name string
    Age  int
}

Person 是结构体类型名

NameAge 是字段
每个字段都有 名称和类型



创建结构体实例

方法1:字段名初始化

p := Person{
    Name: "Alice",
    Age:  30,
}

可以只初始化部分字段
未初始化字段 → 零值

p := Person{
    Name: "Bob",
} 
// Age 默认为 0


方法2:按顺序初始化(不推荐,易出错)

p := Person{"Charlie", 25}

必须给所有字段赋值

易读性差,不推荐



访问和修改字段

fmt.Println(p.Name) // Alice
p.Age = 31          // 修改字段值


指针与结构体

可以使用指针访问字段:

p := &Person{Name: "David", Age: 40}
fmt.Println(p.Name) // Go 会自动解引用
p.Age = 41

Go 会自动将 p.Name 转换为 (*p).Name

使用指针可以避免复制整个结构体



嵌套结构体

结构体可以嵌套其他结构体:

type Employee struct {
    Person
    Salary float64
}

嵌套的 Person 字段可以 直接访问其字段

e := Employee{
    Person: Person{Name: "Tom", Age: 50},
    Salary: 5000,
}
fmt.Println(e.Name) // 直接访问嵌套字段


匿名字段(嵌入类型)

结构体可以嵌入类型而非字段名:

type Address struct {
    City  string
    State string
}
type Person struct {
    string  // 匿名字段
    int     // 匿名字段
    Address // 嵌套结构体
}

匿名字段会提升字段名,可以直接访问
常用于组合(composition)而非继承



结构体零值

所有字段取各自类型的零值
字符串 → ""
int → 0
指针 → nil
切片 → nil



结构体作为函数参数

结构体是 值类型

func f(p Person) {
    p.Age = 100
}
p := Person{Name: "Alice", Age: 30}
f(p)
fmt.Println(p.Age) // 30,原结构体未改变

如果想修改原结构体,使用指针:

func f(p *Person) {
    p.Age = 100
}
f(&p)
fmt.Println(p.Age) // 100


结构体比较

可以使用 == 比较 完全相同类型的结构体

字段值都相等才返回 true
含切片、map、函数字段的结构体 不能直接比较

type Point struct{ X, Y int }
p1 := Point{1, 2}
p2 := Point{1, 2}
fmt.Println(p1 == p2) // true


结构体常用场景

组合相关数据
网络消息封装
JSON 映射
配置数据

v2ray节点购买