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]