您好,登錄后才能下訂單哦!
//切片并不是數(shù)組或數(shù)組指針,它通過內(nèi)部指針和相關(guān)屬性引用數(shù)組片段,以實(shí)現(xiàn)變長的方案。
//slice并不是真正意義上的動(dòng)態(tài)數(shù)組,而是一個(gè)引用類型。slice總是指向一個(gè)底層array,slice的聲明也可以像array一樣,只是不需要長度。
//slice和數(shù)組的區(qū)別:聲明數(shù)組時(shí),方括號內(nèi)寫明了數(shù)組的長度或使用...自動(dòng)計(jì)算長度,而聲明slice時(shí),方括號內(nèi)沒有任何字符。
slice和數(shù)組的區(qū)別:聲明數(shù)組時(shí),方括號內(nèi)寫明了數(shù)組的長度或使用...自動(dòng)計(jì)算長度,而聲明slice時(shí),方括號內(nèi)沒有任何字符。
第二:注意:make只能創(chuàng)建slice、map和channel,并且返回一個(gè)有初始值(非零)。
操作 | 含義 |
s[n] | 切片s中索引位置為n的項(xiàng) |
s[:] | 從切片s的索引位置0到len(s)-1處所獲得的切片 |
s[low:] | 從切片s的索引位置low到len(s)-1處所獲得的切片 |
s[:high] | 從切片s的索引位置0到high處所獲得的切片,len=high |
s[low:high] | 從切片s的索引位置low到high處所獲得的切片,len=high-low |
s[low:high:max] | 從切片s的索引位置low到high處所獲得的切片,len=high-low,cap=max-low |
len(s) | 切片s的長度,總是<=cap(s) |
cap(s) | 切片s的容量,總是>=len(s) |
示例說明:
array := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
操作 | 結(jié)果 | len | cap | 說明 | |
array[:6:8] | [0 1 2 3 4 5] | 6 | 8 | 省略 low | |
array[5:] | [5 6 7 8 9] | 5 | 5 | 省略 high、 max | |
array[:3] | [0 1 2] | 3 | 10 | 省略 high、 max | |
array[:] | [0 1 2 3 4 5 6 7 8 9] | 10 | 10 | 全部省略 |
第三:切片和底層數(shù)組關(guān)系
s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := s[2:5] //[2 3 4]
s1[2] = 100 //修改切片某個(gè)元素改變底層數(shù)組
fmt.Println(s1, s) //[2 3 100] [0 1 2 3 100 5 6 7 8 9]
s2 := s1[2:6] // 新切片依舊指向原底層數(shù)組 [100 5 6 7]
s2[3] = 200
fmt.Println(s2) //[100 5 6 200]
fmt.Println(s) //[0 1 2 3 100 5 6 200 8 9]
第四,slice的內(nèi)建函數(shù)append和copy的使用
1) append
append函數(shù)向 slice 尾部添加數(shù)據(jù),返回新的 slice 對象:
var s1 []int //創(chuàng)建nil切換
//s1 := make([]int, 0)
s1 = append(s1, 1) //追加1個(gè)元素
s1 = append(s1, 2, 3) //追加2個(gè)元素
s1 = append(s1, 4, 5, 6) //追加3個(gè)元素
fmt.Println(s1) //[1 2 3 4 5 6]
s2 := make([]int, 5)
s2 = append(s2, 6)
fmt.Println(s2) //[0 0 0 0 0 6]
s3 := []int{1, 2, 3}
s3 = append(s3, 4, 5)
fmt.Println(s3)//[1 2 3 4 5]
append函數(shù)會(huì)智能地底層數(shù)組的容量增長,一旦超過原底層數(shù)組容量,通常以2倍容量重新分配底層數(shù)組,并復(fù)制原來的數(shù)據(jù):
func main() {
s := make([]int, 0, 1)
c := cap(s)
for i := 0; i < 50; i++ {
s = append(s, i)
if n := cap(s); n > c {
fmt.Printf("cap: %d -> %d\n", c, n)
c = n
}
}
/*
cap: 1 -> 2
cap: 2 -> 4
cap: 4 -> 8
cap: 8 -> 16
cap: 16 -> 32
cap: 32 -> 64
*/
}
2) copy
函數(shù) copy 在兩個(gè) slice 間復(fù)制數(shù)據(jù),復(fù)制?度以 len 小的為準(zhǔn),兩個(gè) slice 可指向同?底層數(shù)組。
data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := data[8:] //{8, 9}
s2 := data[:5] //{0, 1, 2, 3, 4}
copy(s2, s1) // dst:s2, src:s1
fmt.Println(s2) //[8 9 2 3 4]
fmt.Println(data) //[8 9 2 3 4 5 6 7 8 9]
第五,切片作為函數(shù)的參數(shù)使用。
func test(s []int) { //切片做函數(shù)參數(shù)
s[0] = -1
fmt.Println("test : ")
for i, v := range s {
fmt.Printf("s[%d]=%d, ", i, v)
//s[0]=-1, s[1]=1, s[2]=2, s[3]=3, s[4]=4, s[5]=5, s[6]=6, s[7]=7, s[8]=8, s[9]=9,
}
fmt.Println("\n")
}
func main() {
slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
test(slice)
fmt.Println("main : ")
for i, v := range slice {
fmt.Printf("slice[%d]=%d, ", i, v)
//slice[0]=-1, slice[1]=1, slice[2]=2, slice[3]=3, slice[4]=4, slice[5]=5, slice[6]=6, slice[7]=7, slice[8]=8, slice[9]=9,
}
fmt.Println("\n")
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。