回答:
fabriziomの回答に加えて、「Go Slices:usage and internals」で他の例を見ることができます[]int
。
スライスのゼロ値(
nil
)は長さがゼロのスライスのように機能するため、スライス変数を宣言してループに追加することができます。
// Filter returns a new slice holding only
// the elements of s that satisfy f()
func Filter(s []int, fn func(int) bool) []int {
var p []int // == nil
for _, v := range s {
if fn(v) {
p = append(p, v)
}
}
return p
}
これは、スライスに追加する、ということを意味、あなたは最初にメモリを割り当てる必要はありません:nil
スライスはp int[]
スライスがに追加するように十分です。
var p []int
使用するよりも宣言の方が簡単だmake
と思います(0キャップを指定しても何も割り当てられない場合でも、割り当てに関連付けます)。読みやすさの点で、私はmake
ここを使用しないことを好みます。
p := []int{}
)。通常:=
、ほとんどの変数を宣言するために構文を使用するため、スライスに例外を設けるのではなく、どこにでもそれを置く方が自然です。これ以外に、割り当てについて考えようとすると、通常、人々は時期尚早の最適化に向かいます。
簡単な宣言
var s []int
はメモリを割り当てず、をs
ポイントしますがnil
、
s := make([]int, 0)
s
0要素のスライスにメモリを割り当て、メモリをポイントします。
通常、ユースケースの正確なサイズがわからない場合は、最初の方が慣用的です。
make
マップする必要がありますmap
。何もないのに、簿記のために割り当てられたスペースが必要だからです。
nil
場合、空の配列ではなくスライスに要素がない場合に宣言型を使用すると戻ります。ただし、make
を使用してスライスを作成すると、代わりに空の配列が返されます。これは通常、望ましい効果です。
var s []int
)null
をマーシャリングすると、が生成され、空のスライス(s := make([]int, 0)
)をマーシャリングすると、期待どおりの結果が得られます[]
もう少し完全に(のもう1つの引数make
)の例:
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
でる:
length: 2 - capacity 5 - content: [0 0]
または動的タイプslice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
でる:
length: 2 - capacity 5 - content: [<nil> <nil>]
nil
スライスを作成するのに対し、2番目のものはempty
スライスを作成します(これは「アクションブックの実行」で使用される用語です)。ここでも同じ回答を投稿しないようにするには、stackoverflow.com