<dl> <dt> 先说结论(这里以int为例): </dt> <dd> []int会作为切片按地址进行传递 </dd> <dd> [3]int会作为数组按值传递 </dd> </dl>
Golang代码实例
package main
import "fmt"
func main(){
a:=[]int{1,2,3}
modifySlice(a)
fmt.Println("main()中 a:",a)
}
func modifySlice(a []int){
a[0]=100
fmt.Println("对切片进行modifySlice()之后 a:",a)
}
<dl> <dt> 输出结果 </dt> <dd> 对切片进行modifySlice()之后 a: [100 2 3]
main()中 a: [100 2 3] </dd> </dl>
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
modifyArr(a)
fmt.Println("main()中 a:", a)
}
func modifyArr(a [3]int) {
a[0] = 100
fmt.Println("对切片进行modifyArr()之后 a:", a)
}
<dl> <dt> 输出结果 </dt> <dd> 对数组进行modifyArr()之后 a: [100 2 3]
main()中 a: [1 2 3] </dd> </dl>
解决了这个问题之后,又遇到一个奇怪的问题,花了一点时间找到了问题所在,现在贴出来供参考:
当函数要返回经过操作之后的slice时,返回的slice的地址发生了改变,不再是传入的地址,代码如下
package main
import (
"fmt"
"unsafe"
)
func main(){
a:=[]int{1,2,3}
b:=modifySlice(a)
fmt.Println(&a==&b)
fmt.Println("作为参数的a的地址:",unsafe.Pointer(&a))
fmt.Println("modifySlice返回的a的地址:",unsafe.Pointer(&b))
}
func modifySlice(a []int) []int{
a[0]=100
return a
}
<dl> <dt> 输出结果 </dt> <dd> false
作为参数的a的地址: 0x115520e0
modifySlice返回的a的地址: 0x115520f0 </dd> </dl>