1. 结构体的声明和初始化

1.1 声明结构体

结构体的声明使用type关键字:

type Person struct {
    Name string
    Age  int
}

1.2 初始化结构体

可以使用字面值初始化结构体:

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

也可以省略字段名(但需要按照字段声明的顺序):

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

对于部分字段初始化,未指定的字段将使用零值:

p := Person{Name: "Bob"}
fmt.Println(p)  // 输出: {Bob 0}

2. 访问和修改结构体字段

使用点操作符.来访问和修改结构体字段:

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

p.Age = 31
fmt.Println(p.Age)  // 输出: 31

3. 结构体指针

可以使用结构体的指针来操作结构体:

3.1 获取结构体的指针

使用取地址符号&

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

3.2 通过指针访问和修改字段

可以直接使用点操作符访问和修改字段,Go会自动解引用:

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

pPtr.Age = 31
fmt.Println(p.Age)  // 输出: 31

4. 匿名字段和嵌套结构体

4.1 匿名字段

匿名字段使结构体看起来像继承了另一个结构体:

type Address struct {
    City, State string
}

type Person struct {
    Name string
    Age  int
    Address  // 匿名字段
}

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

4.2 嵌套结构体

嵌套结构体是结构体中包含另一个结构体:

type Address struct {
    City, State string
}

type Person struct {
    Name string
    Age  int
    Address Address
}

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

5. 方法与结构体

可以为结构体定义方法:

5.1 值接收者方法

值接收者方法在方法调用时会复制结构体:

func (p Person) Greet() {
    fmt.Printf("Hello, my name is %s\n", p.Name)
}

p := Person{Name: "Alice", Age: 30}
p.Greet()  // 输出: Hello, my name is Alice

5.2 指针接收者方法

指针接收者方法在方法调用时不会复制结构体,可以修改结构体字段:

func (p *Person) UpdateAge(newAge int) {
    p.Age = newAge
}

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

6. 结构体标签(Tags)

结构体标签常用于与反射相关的操作,如JSON序列化:

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

p := Person{Name: "Alice", Age: 30}
jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData))  // 输出: {"name":"Alice","age":30}

7. 结构体比较

如果结构体的所有字段都可以比较,则结构体也可以比较:

type Point struct {
    X, Y int
}

p1 := Point{X: 1, Y: 2}
p2 := Point{X: 1, Y: 2}
fmt.Println(p1 == p2)  // 输出: true

8. 结构体的零值

结构体的零值是每个字段都是该字段类型的零值:

var p Person
fmt.Println(p)  // 输出: { 0 { 0}}

9. 使用构造函数创建结构体

可以定义一个函数来创建和初始化结构体:

func NewPerson(name string, age int) Person {
    return Person{Name: name, Age: age}
}

p := NewPerson("Alice", 30)
fmt.Println(p)  // 输出: {Alice 30}

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:http://example.com/subject/article/83/

许可协议:署名-非商业性使用 4.0 国际许可协议