2013-11-27 5 views

答えて

23

それはかなり大きな違いを作る:違いはarraysliceの間にあります。

[]stringは、文字列の配列を指すスライスを作成します。一方、[...]実際のの文字列を作成します。

golangブログの2つの違いについては、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

私はあなたの2番目の例で 'someArray'と' otherArray'の長さを入れ替えるべきだと思います:) –

+0

@VladimirMatveev良いキャッチ:) –