Golang中的值拷贝与引用拷贝
变量间的赋值(值拷贝)
a:=1 b:=a fmt.Println(b,&a,&b)
方法调用
值拷贝:
1 array
golang中以array作为参数的方法调用,方法接收的是整个array的值拷贝,所以方法中对array的item重新赋值不起作用。
如以下代码所示,输出为[1, 2, 3]。
package main import "fmt" func modify(a [3]int) { a[0] = 4 } func main() { a := [3]int{1, 2, 3} modify(a) fmt.Println(a) }
2 struct
如下代码传参为struct值拷贝,modify方法或modify函数对person的name属性重新赋值不起作用。
package main import "fmt" type person struct { name string } func (p person) modify() { p.name = "jacky" } func modify(p person) { p.name = "jacky" } func main() { p := person{"larry"} p.modify() // modify(p) fmt.Println(p) }
2.引用拷贝
2.1 slice
slice作为底层的数组引用,方法调用采用的是引用的拷贝。
所以,如下第一段代码,函数的引用拷贝与原始引用指向同一块数组,对slice的item重新赋值是生效的,输出为[4, 2, 3]。
package main import "fmt" func modify(s []int) { s[0] = 4 } func main() { s := []int{1, 2, 3} modify(s) fmt.Println(s) }
但第二段代码,输出结果未变化,仍为[1, 2, 3]。是因为对引用的拷贝重新赋值,并不会更改原始引用。
package main import "fmt" func modify(s []int) { s = append(s, 4) } func main() { s := []int{1, 2, 3} modify(s) fmt.Println(s) }
所以对slice进行append操作,需要将其作为返回值返回,如以下代码所示,输出为[1 2 3 4]。
package main import "fmt" func modify(s []int) []int { s = append(s, 4) return s } func main() { s := []int{1, 2, 3} s = modify(s) fmt.Println(s) }
2.2 struct pointer(结构体指针)
若想改变struct的属性值,传参采用struct pointer。
package main import "fmt" type person struct { name string } func (p *person) modify() { p.name = "jacky" } func modify(p *person) { p.name = "jacky" } func main() { p := &person{"larry"} p.modify() // modify(p) fmt.Println(p) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2018-11-20 ab压力测试遭遇apr_socket_recv: Connection reset by peer (104) 怎么办
2016-11-20 SQL注入漏洞产生的原因是什么?怎么防止?XSS呢?