slice是一個可變長度序列,用于存儲相似類型的元素,不允許在同一slice中存儲不同類型的元素。就像具有索引值和長度的數(shù)組一樣,但是切片的大小允許調整,它們不像數(shù)組那樣處于固定大小。在Go語言中,允許您將切片傳遞給函數(shù),這意味著該函數(shù)獲取切片的副本。
切片將按值與切片的容量,長度一起傳遞給函數(shù),并且切片的指針始終指向基礎數(shù)組。 因此,如果我們對通過值傳遞給函數(shù)的切片進行了一些更改,則會反映在函數(shù)外部存在的切片中。讓我們借助示例來討論這個概念:
//向函數(shù)傳遞一個切片 package main import "fmt" //切片所在的函數(shù) //通過值傳遞 func myfun(element []string) { //修改給定的切片 element[2] = "Java" fmt.Println("修改切片: ", element) } func main() { //創(chuàng)建切片 slc := []string{"C#", "Python", "C", "Perl"} fmt.Println("初始切片: ", slc) //將切片傳遞給函數(shù) myfun(slc) fmt.Println("最終切片:", slc) }
輸出:
初始切片: [C# Python C Perl] 修改切片: [C# Python Java Perl] 最終切片: [C# Python Java Perl]
用法說明:在上面的示例中,我們有一個名為slc的切片。這個片通過myfun()函數(shù)傳遞。正如我們所知,切片指針總是指向相同的引用,即使它們在函數(shù)中傳遞。因此,當我們將值C,索引值為2更改為Java時。這個變化也反映了函數(shù)外部的切片,所以修改后的最后一個切片是[c# Python Java perl]。
//將切片傳遞給函數(shù) package main import "fmt" //通過值傳遞 func myfun(element []string) { //這里我們只修改切片 //使用append函數(shù) //在這里,此函數(shù)僅修改 //存在于其中的切片的副本 //該函數(shù)不修改原始切片 element = append(element, "Java") fmt.Println("修改切片: ", element) } func main() { //創(chuàng)建切片 slc := []string{"C#", "Python", "C", "Perl"} fmt.Println("初始切片: ", slc) //傳遞切片 //到函數(shù) myfun(slc) fmt.Println("最終切片: ", slc) }
輸出:
初始切片: [C# Python C Perl] 修改切片: [C# Python C Perl Java] 最終切片: [C# Python C Perl]