Go 切片作为函数参数
slice是一个可变长度序列,用于存储相似类型的元素,不允许在同一slice中存储不同类型的元素。就像具有索引值和长度的数组一样,但是切片的大小允许调整,它们不像数组那样处于固定大小。在Go语言中,允许您将切片传递给函数,这意味着该函数获取切片的副本。
切片将按值与切片的容量,长度一起传递给函数,并且切片的指针始终指向基础数组。 因此,如果我们对通过值传递给函数的切片进行了一些更改,则会反映在函数外部存在的切片中。让我们借助示例来讨论这个概念:
//向函数传递一个切片 package main import "fmt" //切片所在的函数 //通过值传递 func myfun(element []string) { //修改给定的切片 element[2] = "Java" fmt.Println("修改切片: ", element) } func main() { //创建切片 slc := []string{"C#", "Python", "C", "Perl"} fmt.Println("初始切片: ", slc) //将切片传递给函数 myfun(slc) fmt.Println("最终切片:", slc) }
输出:
初始切片: [C# Python C Perl] 修改切片: [C# Python Java Perl] 最终切片: [C# Python Java Perl]
用法说明:在上面的示例中,我们有一个名为slc的切片。这个片通过myfun()函数传递。正如我们所知,切片指针总是指向相同的引用,即使它们在函数中传递。因此,当我们将值C,索引值为2更改为Java时。这个变化也反映了函数外部的切片,所以修改后的最后一个切片是[c# Python Java perl]。
//将切片传递给函数 package main import "fmt" //通过值传递 func myfun(element []string) { //这里我们只修改切片 //使用append函数 //在这里,此函数仅修改 //存在于其中的切片的副本 //该函数不修改原始切片 element = append(element, "Java") fmt.Println("修改切片: ", element) } func main() { //创建切片 slc := []string{"C#", "Python", "C", "Perl"} fmt.Println("初始切片: ", slc) //传递切片 //到函数 myfun(slc) fmt.Println("最终切片: ", slc) }
输出:
初始切片: [C# Python C Perl] 修改切片: [C# Python C Perl Java] 最终切片: [C# Python C Perl]