在go lang spec中,的例子:Go lang x:= [...] string {「Sat」,「Sun」} vs x:= [] string {「Sat」,「Sun」}
days := [...]string{"Sat", "Sun"} // len(days) == 2
如果三個點被遺漏了,它有什麼區別嗎?
在go lang spec中,的例子:Go lang x:= [...] string {「Sat」,「Sun」} vs x:= [] string {「Sat」,「Sun」}
days := [...]string{"Sat", "Sun"} // len(days) == 2
如果三個點被遺漏了,它有什麼區別嗎?
它使得相當大的區別:區別在於array
和slice
。
[]string
創建一個指向字符串數組的切片。另一方面,[...]
創建了一個實際的字符串數組。
關於golang博客上兩者之間的區別,有一個很好的blog post。我會盡力在這裏總結一下,盡我所能。
golang中的數組類似於值類型,它們是對特定類型的引用,並且總是具有特定的長度。有兩種方法來創建陣列:1)使用顯式的長度和2)隱式長度:
// Explicit length.
var days := [7]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }
// Implicit length. (Let the compiler figure it out how long it is)
var days := [...]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }
這些都是等效陣列定義。請注意,數組的長度是的部分它的類型定義。所以,你無法類型相似與不同長度的交換陣列:
// These two are not interchangeable!
var someArray [5]string;
var otherArray [10]string;
func work(data [5]string) { /* ... */ }
work(someArray) // good
work(otherArray) // not so good
還要注意的是數組,結構一樣,作爲價值–通過數組的副本將被傳遞給函數,而不是對它的引用。
另一方面,切片就像引用類型。它們由一個數組支持,但它們更具可塑性。它們包括一個指向數組中某個位置的指針,一個長度和一個容量。
// Create a slice
var days := []string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }
切片,不同於陣列,未明確結合於它們的長度和不同長度的片可以被傳遞給彼此。它們更像一個指針,這意味着它們通過引用傳遞,而不是價值。
還有一個關於Go Data Structures的好帖子,以及它們是如何在內存中表示的。我強烈建議檢查一下。
我認爲你應該在你的第二個例子中交換'someArray'和'otherArray'的長度:) –
@VladimirMatveev好抓:) –