go 陣列與slice的區別

2021-10-09 01:56:07 字數 1700 閱讀 3304

總結:

2. 相同大小陣列可以賦值,會拷貝全部內容。slice賦值和指標一樣。陣列和slice之間不能相互賦值。當然slice有自己的copy函式

3. 陣列也可以進行切片,返回值是乙個slice,改變slice時會同步修改陣列內容,相當於取得了這個陣列的指標

測試:

// 陣列定義方式

// 1 寫明長度

c1 := [5]int

// 2 自動獲取長度

c2 := [...]int

// slice定義方式

// 1 不寫明長度就是slice

c5 := int

// 2 使用make定義的也是slice

c6 := make(int, 5, 10) // 5 是其長度,10 是其容量(可選),分別可以通過 len(sli) cap(sli) 獲取

3. 陣列賦值時會拷貝內容,slice會賦值引用和指標一樣

// 陣列拷貝測試

c1 := [...]int

c2 := [...]int

c3 := c2

c2 = c1

c2[2] = 10

fmt.println("c1", c1, len(c1), cap(c1))

fmt.println("c2", c2, len(c2), cap(c2))

fmt.println("c3", c3, len(c3), cap(c3))

// result

c1 [1 2 3] 3 3 // c1 沒有隨c2的賦值改變

c2 [1 2 10] 3 3 // c2 拷貝了乙份c1, 不同長度的陣列不能拷貝

c3 [4 5 6] 3 3 // c3 拷貝了乙份c2

// slice 拷貝測試

c5 := int

c6 := make(int, 5, 10)

c7 := c6

c6 = c5

c6[2] = 20

fmt.println("c5", c5, len(c5), cap(c5))

fmt.println("c6", c6, len(c6), cap(c6))

fmt.println("c7", c7, len(c7), cap(c7))

// result

c5 [1 2 20] 3 3 // c5 內容 隨c6的賦值改變了

c6 [1 2 20] 3 3 // c6 取得了對c5內容的引用

c7 [0 0 0 0 0] 5 10 // c7 取得了對c6原來內容的引用

4. 陣列也可以進行切片,返回值是slice,改變slice時會同步修改陣列內容,相當於取得這個陣列的指標

c8 := c1[:1]

fmt.println("c1", c1, len(c1), cap(c1))

fmt.println("c8", c8, len(c8), cap(c8))

// result

c1 [1 22 22] 3 3 // 陣列內容發生改變,但長度不會改變

c8 [1 22 22 22] 4 6 // slice取得了陣列c1的引用

Go語言中陣列和slice的區別

go語言中陣列是具有固定長度而且擁有零個或者多個相同或相同資料型別元素的序列。由於陣列長度固定,所以在go語言比較少直接使用。而slice長度可增可減,使用場合比較多。更深入的區別在於 陣列在使用的過程中都是值傳遞,將乙個陣列賦值給乙個新變數或作為方法引數傳遞時,是將源陣列在記憶體中完全複製了乙份,...

slice與splice的區別

slice 從已有的陣列中返回選定的元素 arrayobject.slice start,end start 必需,規定從何處開始選取,如果是負數,那麼就規定從陣列尾部開始算起 end 可選,規定從何處結束 splice 向 從陣列中新增 刪除專案,然後返回被刪除的專案 arrayobject.sp...

十六 GO語言的陣列和切片 slice

1.陣列 陣列可以存放多個同樣的資料型別資料,陣列也是一種資料型別,在go中,陣列是值型別 陣列的定義 語法 var 陣列名 陣列大小 資料型別 示例 var array 5 int 賦值 array 0 1 a 1 30 中括號中輸入的是陣列中元素的下標,從0開始,0就是第乙個元素 上圖中,前面三...