1. 程式人生 > >Go學習筆記陣列切片和容器(五)

Go學習筆記陣列切片和容器(五)


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)