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 验证答案。