传int改副本,传int改原变量;go所有参数均为值传递,但int传递的是地址副本,解引用可修改原值。
函数参数传 int 和传 *int 的区别在哪?
区别就一句话:传 int 是改副本,传 *int 是改本人。
Go 所有传参都是值传递,但“值”本身可以是数字(比如 42),也可以是地址(比如 0xc000010240)。传 *int 时,你传的是地址的副本——它仍指向原变量,所以解引用 *p = 42 就真把原变量改了。
- 常见错误现象:
modifyByValue(a)后a没变,以为函数“不生效”,其实是没传地址 - 必须传指针的场景:需要在函数里更新调用方的变量,比如解析配置、填充错误码、计数器自增
- 性能影响:对
int这种小类型,传值和传指针几乎没差别;但别因此养成“一律传指针”的习惯——语义错位比性能损耗更难调试
结构体该用 Person{} 还是 &Person{} 传参?
看两点:结构体大小 + 是否要改字段。
小结构体(比如 2–3 个基础字段)传值更清晰;大结构体(含数组、嵌套 map、大字符串)传指针避免复制开销。更重要的是:只有传指针,函数才能真正修改原结构体字段。