go 结构体

在 Go 语言中,结构体(struct) 是一种用户定义的复合数据类型,用于将多个不同类型的字段(fields)组合在一起,形成一个逻辑上的整体。结构体是 Go 语言中面向对象编程的基础,可以用来表示复杂的数据结构。


定义结构体

使用 type 和 struct 关键字定义结构体。语法如下:

type 结构体名称 struct {
    字段1 字段1类型
    字段2 字段2类型
    ...
}

示例

type Person struct {
    Name string
    Age  int
}

创建结构体实例

可以通过以下几种方式创建结构体实例:

  1. 直接声明
    var p Person
    p.Name = "Alice"
    p.Age = 25
  2. 使用结构体字面量
    p := Person{Name: "Bob", Age: 30}
  3. 省略字段名(按字段顺序初始化)
    p := Person{"Charlie", 35}
  4. 使用 new 关键字(返回指针)
    p := new(Person)
    p.Name = "Dave"
    p.Age = 40

访问结构体字段

使用点号 . 访问结构体的字段:

p := Person{Name: "Alice", Age: 25}
fmt.Println(p.Name) // 输出: Alice
fmt.Println(p.Age)  // 输出: 25

结构体的嵌套

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

示例

type Address struct {
    City  string
    State string
}

type Person struct {
    Name    string
    Age     int
    Address Address // 嵌套结构体
}

func main() {
    p := Person{
        Name: "Alice",
        Age:  25,
        Address: Address{
            City:  "New York",
            State: "NY",
        },
    }
    fmt.Println(p.Address.City) // 输出: New York
}

匿名结构体

Go 支持匿名结构体,即不需要定义结构体类型,直接声明并使用。

示例

p := struct {
    Name string
    Age  int
}{
    Name: "Alice",
    Age:  25,
}
fmt.Println(p.Name) // 输出: Alice

结构体方法

Go 语言中没有类的概念,但可以通过为结构体定义方法来实现类似的行为。方法是一个带有接收者(receiver)的函数。

示例

type Person struct {
    Name string
    Age  int
}

// 为 Person 结构体定义一个方法
func (p Person) SayHello() {
    fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}

func main() {
    p := Person{Name: "Alice", Age: 25}
    p.SayHello() // 输出: Hello, my name is Alice and I am 25 years old.
}

结构体的指针接收者

如果需要在方法中修改结构体的字段,可以使用指针接收者。

示例

func (p *Person) Birthday() {
    p.Age++
}

func main() {
    p := Person{Name: "Alice", Age: 25}
    p.Birthday()
    fmt.Println(p.Age) // 输出: 26
}

结构体的标签(Tag)

结构体的字段可以附加标签(Tag),标签是字符串形式的元数据,通常用于序列化、验证等场景。

示例

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

结构体的比较

如果结构体的所有字段都是可比较的(如基本类型、数组、指针等),则结构体本身也是可比较的。

示例

p1 := Person{Name: "Alice", Age: 25}
p2 := Person{Name: "Alice", Age: 25}
fmt.Println(p1 == p2) // 输出: true

总结

  • 结构体是 Go 语言中组织数据的核心工具。
  • 结构体可以嵌套、定义方法、附加标签,支持面向对象编程。
  • 结构体的字段可以是任意类型,包括切片、数组、map、甚至其他结构体。
  • 结构体是值类型,传递时会复制整个结构体,如果需要修改原结构体,可以使用指针。
Posted in Go