Go學習筆記陣列切片和容器(五)
阿新 • • 發佈:2018-11-29
func main() { //定義陣列 數量在型別的前面 var arr [5] int // 不定義值為0 arr1 := [3]int{1} // := 必須賦值 最少賦值1位 arr2 := [...]int{4,5,6,7,8} //...可不規定長度 //二維陣列 var arr3 [2][5]int fmt.Println(arr, arr1, arr2, arr3) //不建議這麼使用 建議用go的range for i:= 0; i < len(arr2); i++ { fmt.Println(arr2[i]) } //建議這麼使用range func itemKey (arr2 [5]int) { for key, item := range arr2 { fmt.Println(key, item) } } //陣列是值型別 會拷貝引用,不會傳遞引用 可以用指標的方式 但是不建議 建議使用切片slice passByValue(&arr2) } //go的陣列是值型別 所以都是值傳遞 可以通過指標去改成引用傳遞 不建議啊!!! func passByValue(arr *[5]int) { arr[0] = 100000 for key, value := range arr { fmt.Println(key, value) } }
a1 := arr[1:] //從下標1開始 到結束 a2 := arr[:3] //從下標0到下標3 不包括下標3 a3 := arr[:] //從下標0到結束 fmt.Println(a1,a2,a3) //切片 func again() { //構造陣列 arr := [...]int{2,3,4,5,6} //獲取陣列切片 sliarr := arr[1:] fmt.Println("切割新的陣列 = ",sliarr) //變更切片裡的值 sliarr[0] = 200 fmt.Println("重新賦值新的陣列 = ",sliarr) //切片只是原來陣列的一個view 合併原來的 fmt.Println("切片只是原來陣列的一個view 合併原來的陣列",arr) } GOROOT=/usr/local/go #gosetup GOPATH=/Users/liutong/go #gosetup /usr/local/go/bin/go build -o /private/var/folders/gw/m800qsgs6mvf4zt_tk_y9jwh0000gn/T/___go_build_Slice_go /Users/liutong/go/src/ltstudy/demo_five/Slice.go #gosetup /private/var/folders/gw/m800qsgs6mvf4zt_tk_y9jwh0000gn/T/___go_build_Slice_go #gosetup 切割新的陣列 = [3 4 5 6] 重新賦值新的陣列 = [200 4 5 6] 切片只是原來陣列的一個view 合併原來的陣列 [2 200 4 5 6] //slice只能向後擴充套件,不能向前擴充套件 func priSlices() { slic := [...]int{0,1,2,3,4,5,6,7} //slice本身沒有資料,是對底層array的一個view s1 := slic[2:5] s2 := s1[1:5] fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d\n", s1,len(s1),cap(s1)) fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d\n", s2,len(s2),cap(s2)) //向切片裡新增資料 append s3 := append(s2,10) s4 := append(s3,11) s5 := append(s4,12) s6 := append(s5,13) fmt.Println(s3, s4, s5, s6) // s4 s5 no longer view arr //新增元素時如果超越cap,系統會重新分配更大的底層陣列 //由於值傳遞的原因,必須接受append的返回值 //s = append(s, val) fmt.Println(slic) //超過原來下面的cap } sli= [2 3 4 5] sli4= 5 [5 6] s1=[2 3 4], len(s1)=3, cap(s1)=6 s2=[3 4 5 6], len(s2)=4, cap(s2)=5 [3 4 5 6 10] [3 4 5 6 10 11] [3 4 5 6 10 11 12] [3 4 5 6 10 11 12 13] [0 1 2 3 4 5 6 10]
slice取出隱藏部分的實現原理:
slice可以擴充套件:ptr開關,len長度,cap整個長度
slice可以像後擴充套件,不可以向前擴充套件
s1[i]不可以超過len,向後擴充套件不可以超過底層陣列的cap(s1)