Go中值类型函数传参会复制副本,修改不影响原变量;结构体同理;需改用指针传参才能修改原始值,且更高效。

在 Go 语言中,值类型(如 int、float64、bool、struct 等)在函数传参时会进行内存复制。这意味着函数接收到的是原始数据的副本,对参数的修改不会影响原始变量。这种行为源于 Go 的“按值传递”机制。
当一个值类型变量作为参数传递给函数时,Go 会在栈上创建该变量的一个完整拷贝。函数内部操作的是这个拷贝,原变量不受影响。
示例:
package main
<p>import "fmt"</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/ai/1608">
<img src="https://img.php.cn/upload/ai_manual/000/969/633/68b6dabc23ed9458.png" alt="Procys">
</a>
<div class="aritcle_card_info">
<a href="/ai/1608">Procys</a>
<p>AI驱动的发票数据处理</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="Procys">
<span>102</span>
</div>
</div>
<a href="/ai/1608" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="Procys">
</a>
</div>
<p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">go语言免费学习笔记(深入)</a>”;</p><p>func modifyValue(x int) {
x = x * 2
fmt.Println("函数内 x =", x) // 输出:函数内 x = 20
}</p><p>func main() {
a := 10
modifyValue(a)
fmt.Println("main 中 a =", a) // 输出:main 中 a = 10
}
尽管 x 在函数中被修改为 20,但 a 的值仍然是 10,因为传入的是副本。
结构体是典型的值类型。如果将结构体传入函数,整个结构体都会被复制一份。
示例:
package main
<p>import "fmt"</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">go语言免费学习笔记(深入)</a>”;</p><p>type Person struct {
Name string
Age int
}</p><p>func updatePerson(p Person) {
p.Age += 1
p.Name = "Updated"
fmt.Printf("函数内: %+v\n", p)
}</p><p>func main() {
person := Person{Name: "Alice", Age: 30}
updatePerson(person)
fmt.Printf("main 中: %+v\n", person) // Age 仍为 30, Name 仍为 "Alice"
}
即使函数中修改了字段,原始结构体未受影响。每次调用都涉及字段级别的内存复制。
若希望函数能修改原始值,应传递指针。指针本身是值,但指向同一块内存地址。
修改上例使用指针:
func updatePerson(p *Person) {
p.Age += 1
p.Name = "Updated"
}
<p>func main() {
person := Person{Name: "Alice", Age: 30}
updatePerson(&person)
fmt.Printf("main 中: %+v\n", person) // 输出修改后的值
}
此时函数操作的是原始结构体的内存位置,修改生效。指针传递只复制地址(通常是 8 字节),大幅减少开销,尤其对大型结构体。
小类型(如 int、bool)复制成本低,无需担心。但大结构体频繁复制会影响性能和内存占用。
建议:对于大对象,优先使用指针传参以避免不必要的内存开销。
基本上就这些。理解值类型的复制行为,有助于写出更高效、预期一致的 Go 代码。不复杂但容易忽略。
以上就是Golang值类型在函数中如何表现_Golang内存复制行为示例讲解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号