数组和切片作为函参传递的不同

来源:互联网 发布:旅游市场调查数据 编辑:程序博客网 时间:2024/06/06 10:02
先说结论(这里以int为例):
[]int会作为切片按地址进行传递
[3]int会作为数组按值传递

Golang代码实例

package mainimport "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)}
输出结果
对切片进行modifySlice()之后 a: [100 2 3]
main()中 a: [100 2 3]
package mainimport "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)}
输出结果
对数组进行modifyArr()之后 a: [100 2 3]
main()中 a: [1 2 3]

解决了这个问题之后,又遇到一个奇怪的问题,花了一点时间找到了问题所在,现在贴出来供参考:

当函数要返回经过操作之后的slice时,返回的slice的地址发生了改变,不再是传入的地址,代码如下

package mainimport (  "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}
输出结果
false
作为参数的a的地址: 0x115520e0
modifySlice返回的a的地址: 0x115520f0
原创粉丝点击