go中结构体参数默认传值,修改不影响原变量;需修改状态、含引用字段或体积大时必须传指针,以避免拷贝开销与隐式共享风险。
结构体作为函数参数时,默认是传值
Go 语言中,所有参数传递都是值传递,struct 也不例外。哪怕结构体很大,调用函数时也会完整复制一份。这意味着:函数内对结构体字段的修改,不会影响原始变量。
常见错误现象:func modify(s MyStruct) { s.Field = "new" } 调用后原 s 毫无变化——因为改的是副本。
- 小结构体(如
type Point struct{ X, Y int })传值开销小,语义清晰,推荐直接传值 - 大结构体(含切片、map、channel 或大量字段)传值会触发内存拷贝,性能下降明显
- 若函数需修改结构体状态,必须传指针,否则无效
什么时候必须用 *struct 而不是 struct
当函数需要「修改调用方持有的结构体实例」时,指针是唯一选择。这不是风格问题,而是语言机制决定的。
典型场景包括: