2013-06-26 41 views
9

go的內置append功能的複雜性是什麼?怎麼樣使用+字符串連接?在golang追加的大O

我想從一個切片中刪除一個元素,通過追加兩個不包含該元素的切片,例如。 http://play.golang.org/p/RIR5fXq-Sf

nums := []int{0, 1, 2, 3, 4, 5, 6, 7} 
fmt.Println(append(nums[:4], nums[5:]...)) 

=> [0 1 2 3 5 6 7] 

http://golang.org/pkg/builtin/#append說,如果目標有足夠的能力,那麼這片是resliced。我希望「複製」是一個持續的時間操作。我也希望這同樣適用於使用+的字符串連接。

+0

一些ref的行爲:http://criticalindirection.com/2016/02/17/slice-with-a-pinch-of-salt/ – user31986

回答

19

這一切都取決於使用的實際實現,但我基於標準的Go和gccgo。

切片

Reslicing指一個結構變化的整數(一個片是帶有三個字段的結構體:長度,容量和指針到背襯存儲器)。

如果切片沒有足夠的容量,append需要分配新的內存並複製舊的內存。對於具有< 1024個元素的切片,其將使容量加倍,對於具有> 1024個元素的切片,它會將其增加1.25倍。

字符串

由於字符串是不可變的,與+每個字符串連接將創建一個新的字符串,這意味着複製舊的一個。所以如果你在循環中做了N次,你將分配N個字符串並且複製N次內存。

+0

謝謝!把'uint8'傳給'string'函數怎麼樣?那是'O(1)'還是'O(n)'? (標準執行) – Kaleidoscope

+2

O(n)。切片是可變的,字符串不是→它必須複製數據。 –

+6

換句話說,將一個元素附加到一個切片將被攤銷O(1)。 – newacct