演示了在实际应用场景中使用指针类型和结构体类型变量的差别:
package main

import (
    "fmt"
)

type Person struct {
    Name string
    Age  int
}

// 使用指针类型修改结构体字段
func modifyPersonByPointer(p *Person) {
    p.Name = "Alice"
    p.Age = 30
}

// 使用结构体类型变量修改结构体字段
func modifyPersonByValue(p Person) {
    p.Name = "Bob"
    p.Age = 25
}

func main() {
    // 创建结构体对象
    person := Person{Name: "John", Age: 40}

    // 使用指针类型修改结构体字段
    modifyPersonByPointer(&person)
    fmt.Println("通过指针类型修改后的结果:", person)

    // 使用结构体类型变量修改结构体字段
    modifyPersonByValue(person)
    fmt.Println("通过结构体类型变量修改后的结果:", person)
}

运行结果:

通过指针类型修改后的结果: {Alice 30}
通过结构体类型变量修改后的结果: {John 40}

可以看到,通过指针类型修改结构体字段后,原始的person对象也被修改了。而通过结构体类型变量修改结构体字段后,原始的person对象并未发生改变。

这个示例展示了在函数内部如何修改结构体字段。通过指针类型传递结构体,在函数内部直接修改指针所指向的数据,从而影响原始结构体对象。而通过结构体类型变量传递,函数内部对结构体的修改只是对参数的复制,不会影响原始结构体对象。

在实际应用中,可以根据需要选择适合的方式来操作结构体数据。如果需要在函数内部修改原始结构体对象,可以使用指针类型;如果不想影响原始对象,可以使用结构体类型变量。