2014-01-10 32 views
1

Go Lang的分片append()可能會分配一個新的後備陣列爲新項目騰出空間。因此,呼叫z = append(x,y)後,如果z的最前的元素被修改,x基本上是未指定 - 這可能會或可能不具有相同的背襯陣列z,和z可能變異其背襯陣列z[0] = foo,其因此可能或可能不會修改x的支持陣列。爲什麼Go slice'append()`沒有引用?

那麼,爲什麼讓這個醜陋的表面呢?相反,使它成爲一個程序錯誤,將追加結果賦給除第一個參數以外的任何東西,爲什麼不用append取而代之*[]T,所以不需要重新分配,並且沒有未定義的變量留下。

這不會解決所有情況,因爲a = x; append(&x,y)仍然會使a未定義,但部分改進似乎比沒有更好。

回答

3

在您的第一個示例中(z = append(x, y)),x未定義並不完全正確。相反,x仍然指向x的原始內容,而z指向那些內容然後指向一些內容。至於你提到的,有兩種可能性:

  • cap(x) > len(x),在這種情況下append只是返回x[:len(x)+1](即延長返回片的長度包含一個額外的元素)
  • cap(x) == len(x),在這種情況下append創建通過複製x的內容,然後附加y作爲第len(x)個元素。

在這兩種情況下,x留在這個意義上,所有的x元素仍然存在大致維持不變。你現在必須小心,因爲你可能有兩個引用相同的底層數據,但這一點表明保持x可以是有用的。

也就是說,我同意可能有append指針可能更簡單,也許這種可能的用例我剛纔描述的不夠常見,不足以保證可能會造成混淆的,稍微更冗長的語義。

+0

修改了我的介紹,以澄清修改'z'使'x'具有未指定的內容。 – misterbee

相關問題