slice是一個(gè)可變長(zhǎng)度序列,用于存儲(chǔ)相似類型的元素,不允許在同一slice中存儲(chǔ)不同類型的元素。就像具有索引值和長(zhǎng)度的數(shù)組一樣,但是切片的大小允許調(diào)整,它們不像數(shù)組那樣處于固定大小。在Go語言中,允許您將切片傳遞給函數(shù),這意味著該函數(shù)獲取切片的副本。
切片將按值與切片的容量,長(zhǎng)度一起傳遞給函數(shù),并且切片的指針始終指向基礎(chǔ)數(shù)組。 因此,如果我們對(duì)通過值傳遞給函數(shù)的切片進(jìn)行了一些更改,則會(huì)反映在函數(shù)外部存在的切片中。讓我們借助示例來討論這個(gè)概念:
//向函數(shù)傳遞一個(gè)切片 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]
用法說明:在上面的示例中,我們有一個(gè)名為slc的切片。這個(gè)片通過myfun()函數(shù)傳遞。正如我們所知,切片指針總是指向相同的引用,即使它們?cè)诤瘮?shù)中傳遞。因此,當(dāng)我們將值C,索引值為2更改為Java時(shí)。這個(gè)變化也反映了函數(shù)外部的切片,所以修改后的最后一個(gè)切片是[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]