在C語言中,數組的概念非常簡單 - 只需指向內存中一行元素的第一個元素的指針,該指針可以通過指針算術/標準的array[i]
語法訪問。什麼是「值」數組?
但是,在Google Go等語言中,「數組就是數值」,而不是指針。那是什麼意思?它是如何實現的?
在C語言中,數組的概念非常簡單 - 只需指向內存中一行元素的第一個元素的指針,該指針可以通過指針算術/標準的array[i]
語法訪問。什麼是「值」數組?
但是,在Google Go等語言中,「數組就是數值」,而不是指針。那是什麼意思?它是如何實現的?
在大多數情況下,它們與C數組相同,但編譯器/解釋器隱藏了指針。這主要是因爲數組可以以完全透明的方式重新定位在內存中,所以這樣的數組看起來具有調整大小的能力。
另一方面它更安全,因爲沒有可能移動指針,你不能泄漏。
Go中的數組也是值,因爲它們作爲值傳遞給函數(以同樣的方式整數,字符串,浮點數等) 要求爲每個函數調用複製整個數組。
這可以是一個大陣,這是非常緩慢的,爲什麼在大多數情況下,通常最好使用切片
從那時起(2010年),文章Slices: usage and internals是有點更精確:
在內存中的[4] INT的表示僅僅是四個整數值佈局順序:
Go的數組是值。
數組變量表示整個數組;它不是一個指向第一個數組元素的指針(就像C中的情況一樣)。
這意味着,當您分配或傳遞數組值時,您將製作其內容的副本。 (爲了避免複製,你可以傳遞一個指向數組的指針,但這是一個指向數組的指針,而不是數組)。
考慮數組的一種方式是作爲一種struct
,但帶有索引而不是命名字段:固定大小的合成值。
C中的一個數組* *與*指向其第一個元素的指針完全相同。它在大多數情況下「降級」爲指針;但也有一些情況,例如'sizeof',其中它們是不同的。另外,指向數組的指針與指向指針的指針等類型不同。 – newacct 2010-06-28 00:46:47