這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
用go寫了幾個應用之後,對它的幾個類型理解得可以說也比較到位。
數組
它跟C語言的數組一樣,有固定的長度,聲明之前必須很設定其長度。由於受C語言的影響,我一直把它當作指標來看待。其實,go的數組是個實值型別,當把一個數組賦值給另一個數組時,是複製了本身給另一個數組。也就是說,當把數組當作參數進行傳遞時,會拷貝整個數組,當然也就與C語言的數組指標引用相比了,效率也就大打折扣了。go數組有一點必須知道,就是它的類型是包括了長度的。一個數組包含了長度,儲存類型,實際值三個參數。[3]int與[4]int是兩個不同的數組。
切片
數組的兄弟slice(切片),它是go中最常用到的類型,因為它是指標,而且沒長度的限制,可以隨時往裡面加資料。所以它的效能不僅比數組高,而且更靈活。其實slice的資料結構裡麵包含了兩個列表:一個是數組,一個是指向這個數組的指標。當聲明一個slice時,go會為數組分配一定的空間,當這個數組被填滿後,又會分配一個元素的空間。而這個指向數組的指標則會維護三個資料,指標(point)、數組空間(room)和數組中有值的個數(num)。當room=num時,就是增加一個新的元素空間。
map
go的map類型跟python的字典幾乎一樣,都是key-value結構,是一個雜湊表,但它的效能跟python比起來,有很大的區別,使用時要明白資料的大小範圍,可以參考這篇文章:http://monnand.me/p/golang-map-bench/zhCN
channel
go裡面有channel類型是go語言與眾不同的地方,也是它的特色類型,它提供了一種機制,在兩個並發執行的函數之間進行同步,並通過傳遞(與該通道元素類型相符的)值來進行通訊。事實上,可以認為 channel 是一個管道或者先進先出隊列,非常簡單且輕量。通道是參考型別,需要使用 make
分配記憶體,它經常與goroutine結合一起應用,不僅用來在兩並發函數之間通訊,也可以用來阻塞程式。