教程 > Go 教程 > Go 高级 阅读:693

Go 语言将切片作为参数传递给函数

本章节我们介绍将切片作为参数传递给函数,切片作为函数的参数和数组或其他数据类型作为参数有很大的不同。

首先我们来看,其实切片是一个对数组的结构体的表示。在Go语言中,其底层表示如下所示

type slice struct {  
    Length        int
    Capacity      int
    ZerothElement *byte
}

其实就是一个结构体。切片包含长度、容量和指向数组第零个元素的指针。

Go 切片的结构体
Go 切片的结构体

当切片传递给函数时,即使它是按值传递的,指针变量也将引用相同的底层数组。因此,当切片作为参数传递给函数时,函数内部所做的更改在函数外部也是可见的。

Go 切片作为函数参数按值传递
Go 切片作为函数参数按值传递

关于这一点,对于其他数据类型的数据,如果按值传递给函数,那么在函数内做的更改在函数外部是不可见的。

下面让我们通过一段代码来验证一下

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之后的结果。这与数组不同,在函数内部对数组所做的更改在函数外部不可见。

查看笔记

扫码一下
查看教程更方便