Go在调用函数传递参数时,除了指针、切片、map等引用型对象外,其它类型参数在传递时都会发生复制。
package main
import "fmt"
type Stu struct {
name string
score []int
}
func main(){
inData:=Stu{"sun",[]int{100,99}}
fmt.Printf("inData ptr:%p\n",&inData)
outData:= proc(inData)
fmt.Printf("outData ptr:%p\n",&outData)
outData.score[0]=60
fmt.Printf("inData %#v\n",inData)
fmt.Printf("outData %#v\n",outData)
}
func proc(fData Stu ) Stu {
// 实参被传入到函数形参时,会将实参复制一遍给形参
fmt.Printf("fData ptr:%p\n",&fData)
// 修改形参中的切片值,会导致实参中的切片值一起变化,
// 说明切片复制始终是以引用方式进行的
fData.score[0]=59
fData.name="zhang"
// 函数返回时,会将形参fData复制一份并返回
// 同理,复制后的切片仍然是同一个地址引用
return fData
}
结果:
inData ptr:0xc0000c4390
fData ptr:0xc0000c43f0
outData ptr:0xc0000c43c0
inData main.Stu{name:"sun", score:[]int{60, 99}}
outData main.Stu{name:"zhang", score:[]int{60, 99}}
分析:
inData,fData,outData的指针地址都不一样,说明都是产生了复制;
函数内修改fData参数中的切片值,调用结束后原inData中的切片值也发生了变化,说明在复制时,对于待复制参数中的切片类型的数据,也是按引用方式处理的;
本文通过一个具体的Go语言示例,解析了Go中函数参数的传递机制,特别是针对切片等引用类型的数据如何进行传递及修改,并展示了这些操作的具体效果。
953

被折叠的 条评论
为什么被折叠?



