1. 程式人生 > >Go——array、slice和map的區別

Go——array、slice和map的區別

clas 數組 大小 長度 數值 [] key 時間復雜度 img

參考文章:https://go101.org/article/container.html

1. 文字表示

技術分享圖片

N:一般稱作長度,表示元素的個數。
T:表示元素的類型,可以是任意類型。
K:在map中表示索引的類型,可以是任意可比較的類型。

2. 例子

技術分享圖片

3. 正篇

如【1】所示,宏觀上來看,array、slice、map的區別在於:

  • a. array的定義是有長度的
  • b. slice的定義沒有長度
  • c. map的定義沒有長度

三種數據類型中的每一個元素都有一個對應的key值,這些key值叫做索引(index)。其中,array和slice的索引都是連續的int類型,並且從0開始遞增計數(這與我們熟知的數組一樣)。而map的索引則不太一樣,可以是任意可比較類型的任意值。比如,定義map如下:

map[string][]

那麽這個map的索引類型就是string,我可以把它的值設為任意一個字符串;如果是bool類型,那麽索引可以是true或者false(這裏說的是索引的值,不是元素的值)。


三種數據類型的區別主要體現在存儲結構的差異。array在內存占有一塊連續的存儲空間,存儲長度n的值和n個元素的值;slice在內存上首先占有一個存儲了長度、空間大小和指針的存儲空間,如果有元素的話,這些元素又占有另一個連續的存儲空間,先前的指針指向這裏的第一個元素;所以說slice的本質其實是一個特殊的指針。map依賴於Go的hashtable算法,元素也占有一個連續的存儲空間,但是元素並不連續(存儲空間的地址是連續的,但是某些地址可能沒有存儲數值,因此也就把有數值的地址隔開了,所以說元素不連續);map的本質也是指針。

這三種數據類型都是用索引來查找元素,時間復雜度都是O(1),但由於存儲結構的差異,所以map查找元素時花費的時間還是要大於array和slice的。


在賦值的時候(傳遞值給新的變量),同樣由於存儲結構上的差異,array是直接把整個數據copy一份,新變量內的元素改變並不會影響舊變量;slice則是把指針copy一份,所以新變量內的元素改變,舊變量也改變;map與slice同理。

Go——array、slice和map的區別