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

当Go语言中的结构体作为值类型在函数间传递时,会进行值拷贝。也就是说,传入函数的是原结构体的一个副本,函数内部对结构体的修改不会影响原始结构体。
值传递的基本行为
Go中默认所有参数传递都是按值进行的。如果函数接收的是结构体类型(而不是指针),那么整个结构体的数据会被复制一份传入函数。
例如:
package mainimport "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代码。关键是根据结构体大小和使用场景决定是否传指针。不复杂但容易忽略细节。
以上就是Golang结构体作为值类型在函数间传递会发生什么的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1401721.html
微信扫一扫
支付宝扫一扫