按理說(shuō),go函數(shù)傳參都是值傳遞哪怔,但是某些情況也是能修改原值的宣蔚,修改的方式與我想象中的又有些區(qū)別特此記錄。
func testArraParam(v []int) {
fmt.Printf("before testArraParam=%v,%p\n", v, &v)
v[1] = 7 //修改數(shù)據(jù)
v = append(v, 4, 5, 6) //添加數(shù)據(jù)
fmt.Printf("after testArraParam=%v,%p\n", v, &v)
}
func main(){
arra1 := make([]int, 0) //創(chuàng)建一個(gè)切片
fmt.Printf("append arra=%v,%p\n", arra1, &arra1)
arra1 = append(arra1, 1, 2, 3) //增加元素
fmt.Printf("before arra=%v,%p\n", arra1, &arra1)
testArraParam(arra1)
fmt.Printf("after arra=%v,%p\n", arra1, &arra1)
}
實(shí)際結(jié)果輸出:
append arra=[],0xc0000044e0
before arra=[1 2 3],0xc0000044e0
before testArraParam=[1 2 3],0xc000004540
after testArraParam=[1 7 3 4 5 6],0xc000004540
after arra=[1 7 3],0xc0000044e0
從結(jié)果看认境,函數(shù)里的 v[1] = 7
生效了胚委。。但好像又不是那么簡(jiǎn)單叉信,因?yàn)楹竺娴腶ppend操作沒(méi)有影響到原來(lái)的切片亩冬。
從指針地址
上看的話,函數(shù)里的v參數(shù)
跟原切片
地址確實(shí)不是同一個(gè)硼身,感覺(jué)有點(diǎn)類似c++中的別名硅急,但是又有些區(qū)別。如果是別名append
就會(huì)修改原值佳遂。這點(diǎn)在日常go使用中需要注意一下营袜。
如果要想函數(shù)中的append
生效的話,我們需要傳遞指針
func testArraParam2(v *[]int) {
fmt.Printf("before testArraParam2=%v,%p\n", *v, v)
(*v)[1] = 7 //修改數(shù)據(jù)
*v = append(*v, 4, 5, 6) //添加數(shù)據(jù)
fmt.Printf("after testArraParam2=%v,%p\n", *v, v)
}
//調(diào)用方式
/*
testArraParam2(&arra1)
fmt.Printf("after testArraParam2 arra=%v,%p\n", arra1, &arra1)
*/
打印結(jié)果
append arra=[],0xc00011c460
before arra=[1 2 3],0xc00011c460
before testArraParam=[1 2 3],0xc00011c4c0
after testArraParam=[1 7 3 4 5 6],0xc00011c4c0
after arra=[1 7 3],0xc00011c460
before testArraParam2=[1 7 3],0xc00011c460
after testArraParam2=[1 7 3 4 5 6],0xc00011c460
after testArraParam2 arra=[1 7 3 4 5 6],0xc00011c460