Golang中slice切片的實現(xiàn)示例
slice
Go語言的切片是對數(shù)組的抽象。
數(shù)組的使用
package main import ( "fmt" ) // 傳遞固定長度的數(shù)組還是值傳遞的方式 func printArray(myArray [5]int) { for index, value := range myArray { fmt.Println("index:", index, "value:", value) } } func main() { var myArr [5]int myArr2 := [10]int{1, 2, 3, 4} myArr3 := [4]int{1, 2, 3, 4} myArr4 := []int{1, 2, 3, 4} for i := 0; i < len(myArr); i++ { fmt.Println(myArr[i]) } for index, value := range myArr2 { fmt.Println("index:", index, "value:", value) } fmt.Printf("myArr1 type=%T\n", myArr) fmt.Printf("myArr2 type=%T\n", myArr2) fmt.Printf("myArr3 type=%T\n", myArr3) }
注意:
數(shù)組傳遞的參數(shù)是以值拷貝的形式進行傳遞,如下:(在函數(shù)中修改了,但在主函數(shù)中并沒有變化)
package main import ( "fmt" ) // 傳遞固定長度的數(shù)組還是值傳遞的方式 func printArray(myArray [5]int) { for index, value := range myArray { fmt.Println("index:", index, "value:", value) } myArray[0] = 15 } func main() { myArr2 := [5]int{1, 2, 3, 4} printArray(myArr2) fmt.Println("==================") for index, value := range myArr2 { fmt.Println("index:", index, "value:", value) } }
Go數(shù)組的長度不可改變,在特定的場景中這樣的集合就不太適合了,Go中就提供了內(nèi)置類型切片(動態(tài)數(shù)組),與數(shù)組相比,切片的長度是不固定的,可以追加時可能使得切片的容量增大。
定義切片
可以聲明一個未指定大小的數(shù)組來定義切片(切片不需要說明長度。)
var identifier []type
使用make()函數(shù)來創(chuàng)建切片:
var slice1 []type = make([]type, len) 也可以簡寫為 slice1 := make([]type, len) //也可以指定容量,其中capacity為可選參數(shù)。 make([]T, length, capacity)
切片的四種初始化的方式
package main import "fmt" func main() { //聲明slice是一個切片,并且初始化,默認值是1,2,3長度是len=3 slice1 := []int{1, 2, 3} //聲明slice是一個切片,但是并沒有為slice分配空間 var slice2 []int slice2 = make([]int, 10, 15) slice2[0] = 100 //聲明slice是一個切片,同時給slice分配3個空間,初始化值是0 var slice3 []int = make([]int, 10) //聲明slice是一個切片,同時為slice分配空間,10個空間,初始化值是0,通過:=推導(dǎo)出slice是一個切片 slice4 := make([]int, 10) fmt.Printf("len=%d,slice=%v\n", len(slice1), slice1) fmt.Printf("len=%d,slice=%v,cap=%d\n", len(slice2), slice2, cap(slice2)) fmt.Printf("len=%d,slice=%v\n", len(slice3), slice3) fmt.Printf("len=%d,slice=%v\n", len(slice4), slice4) }
切片的追加,截取與拷貝
切片示意圖:
追加
如果想增加切片的容量,我們必須創(chuàng)建一個新的更大的切片并把原分片的內(nèi)容都拷貝過來
長度增加后,超過容量,則容量增加2倍
package main import "fmt" func main() { var numbers = make([]int, 3, 5) fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers) numbers = append(numbers, 1) fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers) numbers = append(numbers, 1) numbers = append(numbers, 1) fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers) }
截取
s := []int{1, 2, 3} //左閉右開 s1 := s[0:2] s1[0] = 100 s[1] = 200 fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s), cap(s), s) fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s1), cap(s1), s1)
拷貝
截取是采用的淺拷貝,是指向的同一個地址。
如果要深拷貝??梢允褂胏opy函數(shù)
s := []int{1, 2, 3} var s1 = make([]int, 3) copy(s1, s) s1[0] = 100 fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s), cap(s), s) fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s1), cap(s1), s1)
到此這篇關(guān)于Golang中slice切片的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Golang slice切片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
intelliJ?idea安裝go開發(fā)環(huán)境并搭建go項目(打包)全過程
最近在配置idea開發(fā)go語言時碰到很多問題,所以這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于intelliJ?idea安裝go開發(fā)環(huán)境并搭建go項目(打包)的相關(guān)資料,需要的朋友可以參考下2023-10-10