2017-12-08 9 views
1

は、私はいくつかのコードでこれを見つけた:Goのシンボル[:]は何ですか?

h := s.Hash(tx) 
sig, err := crypto.Sign(h[:], prv) 

[:]は何を意味するのでしょうか? これが配列のフルスライスの場合は、配列自体を渡すのはなぜですか?どんな種類のコーディングスタイルがこれでしょうか...私は思っています...

+1

フルツアー(Go Tour(https://tour.golang.org/moretypes/10)に記載されています)のスライスを取って、完全な配列の代わりに渡します配列ではなくスライスを受け入れる関数。それらは交換できません。 – Adrian

+1

[:]の理由の1つは、余分なコピーをせずに配列のデータへの参照(スライス)を作成することによって、配列からスライスに変換できることです。関数(メソッド)に渡すだけなら、データの新しいコピーを作成します。 –

答えて

3

ここで、配列とスライスはわずかに異なり、互換的に使用することはできません。ただし、演​​算子[:]を使用すると、簡単に配列からスライスを作成できます。

この記事では、Go Slices: Usage and Internalsについて詳しく説明しています。

Goプログラミング言語仕様のSlice Expressionsセクションも参照してください。

簡潔に言えば、[:]演算子を使用すると、オプションで開始境界と終了境界を使用して配列からスライスを作成できます。たとえば、次のようになります。

a := [3]int{1, 2, 3, 4} // "a" has type [4]int (array of 4 ints) 
x := a[:] // "x" has type []int (slice of ints) and length 4 
y := a[:2] // "y" has type []int, length 2, values {1, 2} 
z := a[2:] // "z" has type []int, length 2, values {3, 4} 
m := a[1:3] // "m" has type []int, length 2, values {2, 3} 

おそらくこの区別の理由は、型の安全性の追加の尺度です。つまり、長さは配列タイプの正式な部分です(たとえば、[4]intは4つの整数の配列であり、異なるサイズは異なるタイプです)。一方、スライスはゼロを含む任意の長さを持つことができます。したがって、既知の長さのシーケンスの安全性を望むなら、Arrayを使用してください。そうでない場合は、便宜上スライスを使用してください。

関連する問題