Go中结构体传值会复制副本,函数内修改不影响原值,大结构体建议用指针传递以提升性能,小结构体或需保护数据时可用值传递。

当Go语言中的结构体作为值类型在函数间传递时,会进行值拷贝。也就是说,传入函数的是原结构体的一个副本,函数内部对结构体的修改不会影响原始结构体。
值传递的基本行为
Go中默认所有参数传递都是按值进行的。如果函数接收的是结构体类型(而不是指针),那么整个结构体的数据会被复制一份传入函数。
例如:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func modify(p Person) {
p.Name = "Alice"
p.Age = 30
}
func main() {
person := Person{Name: "Bob", Age: 25}
modify(person)
fmt.Println(person) // 输出: {Bob 25}
}
尽管
modify函数修改了结构体字段,但
main中的
person没有变化,因为函数操作的是副本。
立即学习“go语言免费学习笔记(深入)”;
性能影响:大结构体的拷贝开销
结构体越大,拷贝的开销就越高。包含多个字段、数组或大对象的结构体会显著增加内存和CPU消耗。
建议:
- 对于较大的结构体,使用指针传递(
*Struct
)更高效 - 避免频繁地在函数间传递大型值类型结构体
- 可通过
pprof
等工具检测性能瓶颈
何时使用值传递,何时用指针
值传递适用于:
- 结构体很小(如只含几个基本类型字段)
- 希望避免外部被意外修改,保证数据安全
- 结构体是不可变的逻辑设计
使用指针传递更合适的情况:
- 结构体较大
- 需要在函数中修改原结构体内容
- 结构体包含可变字段如切片、映射等引用类型
基本上就这些。理解值拷贝的行为有助于写出更安全、高效的Go代码。关键是根据结构体大小和使用场景决定是否传指针。不复杂但容易忽略细节。










