2013-11-27 52 views

回答

23

它使得相當大的區別:區別在於arrayslice

[]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的好帖子,以及它們是如何在內存中表示的。我強烈建議檢查一下。

+1

我認爲你應該在你的第二個例子中交換'someArray'和'otherArray'的長度:) –

+0

@VladimirMatveev好抓:) –

相關問題