把切片传递给函数

函数间传递切片就是要在函数间以值的方式传递切片。由于切片的尺寸很小,在函数间复制和传递切片成本也很低。

让我们创建一个包含 100 万个整数的切片,并将这个切片以值的方式传递给函数 foo():

  1. func main() {
  2. myNum := make([]int, 1e6)
  3. // 将 myNum 传递到函数 foo()
  4. slice2 := foo(myNum)
  5. // 函数 foo() 接收一个整型切片,并返回这个切片
  6. fmt.Println(len(slice2))
  7. }
  8. func foo(slice []int) []int {
  9. return slice
  10. }

在 64 位架构的机器上,一个切片需要 24 字节的内存:指针字段需要 8 字节,长度和容量字段分别需要 8 字节。由于与切片关联的数据包含在底层数组里,不属于切片本身,所以将切片复制到任意函数的时候,对底层数组大小都不会有影响。复制时只会复制切片本身,不会涉及底层数组:

把切片传递给函数 - 图1

在函数间传递 24 字节的数据会非常快速、简单。这也是切片效率高的地方。不需要传递指针和处理复杂的语法,只需要复制切片,按想要的方式修改数据,然后传递回一份新的切片副本。