Go slice 切片的「陷阱」和本質

2022-03-16 22:43:17 字數 906 閱讀 7391

總結了go語言中切片slice的特殊性和使用時的注意事項。

個人理解,不足之處歡迎指出。

slice:切片,是go語言中一種常用的資料結構,基於陣列構建,表示相同資料型別的集合。

go中陣列型別表示固定長度的相同型別的資料的集合,資料在記憶體中連續儲存,可以通過下標索引,但是又有特殊的地方:

所以go語言中使用陣列傳遞資料效率很低,通常使用切片。

切片是乙個陣列片段的描述,包含了指向陣列片段的指標,片段的長度len和容量cap(陣列片段的最大長度),但是切片本身並不是真正的指標型別

切片之間賦值或者切片作函式引數傳遞時,是將指向陣列片段的指標傳遞過去,所以改變乙個會影響另乙個。

切片作函式引數傳遞或淺拷貝時,之所以改變乙個切片的資料會影響另乙個切片,是因為兩個切片中中包含了指向同一陣列片段的指標。

一切看似正常?但是當乙個切片發生擴容時,會將當前切片內的資料複製到另一片記憶體區域,該切片的陣列片段的位址發生改變,所以當切片擴容時修改乙個切片的資料時不會再影響到另乙個切片!此時只能通過傳遞切片本身的位址來解決。

擴容時出錯的**如下:

package main

import "fmt"

func testslice(slice int)

func main()

testslice(slice)

fmt.println("main:",slice)

}

可以證明,切片不是指標型別,切片資料型別是包含指向乙個陣列片段的指標,和當前陣列片段的長度,以及當前陣列最大容量的一種復合資料結構

想深入了解go中slice資料型別的底層實現,可以參考本人實現slice的源**自己動手實現go切片資料結構

Go slice切片的「陷阱」和本質

總結了go語言中切片slice的特殊性和使用時的注意事項。個人理解,不足之處歡迎指出。slice 切片,是go語言中一種常用的資料結構,基於陣列構建,表示相同資料型別的集合。go中陣列型別表示固定長度的相同型別的資料的集合,資料在記憶體中連續儲存,可以通過下標索引,但是又有特殊的地方 所以go語言中...

Go Slice 使用中的小陷阱

go中的切片有兩個特性 type slice struct包括從切片和陣列派生出來的切片都是公用乙個底層陣列的 make構造出來的切片,已經預先填充了len個零值元素了。總而言之,對切片的更改都會影響到底層的陣列結構,因此需要慎重。動手做個實驗 package main import fmt fun...

Go語言切片筆記3 切片的本質make()函式

package main import fmt 切片的本質 切片就是框柱了一塊連續的記憶體 屬於引用型別 真正的資料都儲存在陣列中 make函式創造切片 使用了make 就開闢了記憶體 func main len s5 0 cap s5 0 s5 nil s6 make int,0 len s6 0...