<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>