2016-10-15 3 views
-2

いくつかのgo配列の初期化と一般的な使用法をテストしていましたが、定義された長さで初期化された配列を展開できない理由がわかりません。GO配列の展開

package main 

func main() { 
    arr0 := []int{1, 2, 3} // 
    add(arr0...)   // OK 

    arr1 := [3]int{1, 2, 3} // 
    slice := arr1[:]  // 
    add(slice...)   // OK 

    arr2 := [3]int{}  // 
    arr2[0] = 1    // 
    arr2[1] = 2    // 
    arr2[3] = 3    // 
    add(arr2...)   // cannot use arr2 (type [3]int) as type 
          // []int in argument to add 
} 

func add(terms ...int) (sum int) { 
    for _, term := range terms { 
     sum += term 
    } 
    return 
} 
+2

ようになります

add(arr2[:]...) 

。配列は静的な長さの値であり、可変引数はスライスを使用します。 – JimB

+0

したがって、arr0:= [] int {1,2,3}を初期化するとき、実際には配列ではなくスライスを初期化しています。 – Gavello

+0

はい、 '[] int {}'はスライスリテラルの構文です。 – JimB

答えて

1

は言った:

[n]typeを - アレイ(固定サイズ)

[]type - スライス

あなたのケースのための迅速な解決がarrayからsliceへの単純な変換になります。それは言語が指定されている方法ですのでちょうどarr2のストレージを指し、それはスライス(コピーではなく)

0

例えばT...ように、尾部としてオペレータ...を使用します。 Tは常にスライスにする必要があります。その他として

関連する問題