Files
2026-03-14 19:03:12 +08:00
..
2026-03-14 19:03:12 +08:00
2026-03-14 19:03:12 +08:00
2026-03-14 19:03:12 +08:00

03-value-pointer - 值传递vs指针传递

知识点讲解

值传递

func modifyValue(x int) {
    x = 100      // 修改的是函数内的副本
}

num := 10
modifyValue(num)
fmt.Println(num)  // 输出: 10(原值不变)

指针传递

func modifyPointer(p *int) {
    *p = 100     // 修改的是指针指向的值
}

num := 10
modifyPointer(&num)
fmt.Println(num)  // 输出: 100(原值被修改)

结构体的值传递

type Person struct {
    Name string
    Age  int
}

func modifyPersonValue(p Person) {
    p.Name = "李四"  // 修改副本
}

p := Person{Name: "张三", Age: 20}
modifyPersonValue(p)
fmt.Println(p.Name)  // 输出: 张三(原值不变)

结构体的指针传递

func modifyPersonPointer(p *Person) {
    p.Name = "李四"  // 修改原值
}

p := Person{Name: "张三", Age: 20}
modifyPersonPointer(&p)
fmt.Println(p.Name)  // 输出: 李四(原值被修改)

重要提示

  • Go中所有参数传递都是值传递
  • 传递指针实际是拷贝指针地址,但通过指针可以修改原值
  • 大结构体使用指针传递可以避免大量拷贝
  • 切片、map等引用类型传递也具有类似指针的行为

学习目标

完成本练习后,你将:

  • ✅ 理解值传递和指针传递的区别
  • ✅ 掌握何时使用值传递
  • ✅ 掌握何时使用指针传递
  • ✅ 了解性能方面的考虑

练习说明

打开 main.go,根据注释提示填充代码,完成后运行 go test -v 验证答案。