扫码一下
查看教程更方便
本章节我们介绍将切片作为参数传递给函数,切片作为函数的参数和数组或其他数据类型作为参数有很大的不同。
首先我们来看,其实切片是一个对数组的结构体的表示。在Go语言中,其底层表示如下所示
type slice struct {
Length int
Capacity int
ZerothElement *byte
}
其实就是一个结构体。切片包含长度、容量和指向数组第零个元素的指针。
当切片传递给函数时,即使它是按值传递的,指针变量也将引用相同的底层数组。因此,当切片作为参数传递给函数时,函数内部所做的更改在函数外部也是可见的。
关于这一点,对于其他数据类型的数据,如果按值传递给函数,那么在函数内做的更改在函数外部是不可见的。
下面让我们通过一段代码来验证一下
package main
import (
"fmt"
)
func subtactOne(numbers []int) {
for i := range numbers {
numbers[i] -= 2
}
}
func main() {
nos := []int{8, 7, 6}
fmt.Println("函数调用之前的slice: ", nos)
subtactOne(nos) // 函数修改slice
fmt.Println("函数调用之后的slice: ", nos) // 切片的修改在函数外部是可见的
}
上述代码执行结果如下
函数调用之前的slice: [8 7 6]
函数调用之后的slice: [6 5 4]
上述程序的函数调用将切片的每个元素值减 2。在函数内执行了减2之后,在函数外部是可见的,打印的结果是减2之后的结果。这与数组不同,在函数内部对数组所做的更改在函数外部不可见。