go語言學習筆記--陣列與切片
一、陣列
基本概念
1、一組相同型別已編號且長度固定的資料項序列
宣告格式:var identifier [len]type
2、Go語言中陣列是一種值型別,不是c中指向首元素地址,函式中使用 陣列作為引數,是值傳遞,會產生一次陣列拷貝。不會修改原資料
3、將陣列傳遞給函式,有兩種方法1)傳遞陣列的指標;2)使用陣列的切片
二、切片
基本概念:
1、切片是對陣列一個連續片段的引用,所以切片是一個引用型別。類似c/c++中的陣列概念,python的list型別。
2、切片的長度可以再執行時修改。最小為0,最大為資料長度。切片是一個長度可變的陣列。計算容量cap(s).就是從s[0]到陣列末尾的陣列長度。
3、多個切片如果表示同一個陣列的片段,它們可以共享資料。
4、宣告切片的格式:var identifier []type(不需要說明長度)。
初始化:var slice1 []type = arr1[start:end]
將切片傳遞給函式:
5、用make()建立一個切片:var slice1 []type = make([]type, len) 或者:slice1 := make([]type, len)
New()和make()的區別:new函式分配記憶體,make函式初始化。
三、切片和陣列的區別:
1、陣列是需要指定個數的,而切片則不需要。陣列賦值也可是使用如下方式,忽略元素個數,使用“...”代替
2、slice和array的關係十分密切,通過兩者的合理構建,既能實現動態靈活的線性結構,也能提供訪問元素的高效效能。當然,這種結構也不是完美無暇,共用底層陣列,在部分修改操作的時候,可能帶來副作用,同時如果一個很大的陣列,那怕只有一個元素被切片應用,那麼剩下的陣列都不會被垃圾回收,這往往也會帶來額外的問題。
3、使用make建立slice,此時golang會生成一個匿名的陣列。
4、append操作超過了原始切片的容量,將會有一個新建底層陣列的過程,那麼此時再修改函式返回切片,應該不會再影響原始切片。