web-dev-qa-db-ja.com

スライスを宣言するか、スライスを作成しますか?

Golangでは、var s []ints := make([]int, 0)の違いは何ですか?

私は両方ともうまくいくと思いますが、どちらが良いですか?

83
Wang Yi

fabriziomanswer に加えて、「 Go Slices:usage and internals 」で他の例を見ることができます。ここで[]intの使用は言及:

スライスのゼロ値(nil)はzero-length sliceのように動作するため、スライス変数を宣言してからループ内:

// 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[]で十分です。

84
VonC

簡単な宣言

var s []int

はメモリを割り当てず、snilをポイントしますが、

s := make([]int, 0)

メモリを割り当て、sは、0個の要素を持つスライスへのメモリを指します。

通常、ユースケースの正確なサイズがわからない場合は、最初のものがより慣用的です。

96
fabrizioM

違いが見つかりました。使用する場合

var list []MyObjects

そして、出力をJSONとしてエンコードすると、nullが得られます。

list := make([]MyObjects, 0)

期待どおり[]になります。

3
Steve Hanov

もう少し完全に(makeのもう1つの引数)の例:

slice := make([]int, 2, 5)
fmt.Printf("lenght:  %d - capacity %d - content:  %d", len(slice), cap(slice), slice)

でる:

lenght:  2 - capacity 5 - content:  [0 0]

または、sliceの動的タイプの場合:

slice := make([]interface{}, 2, 5)
fmt.Printf("lenght:  %d - capacity %d - content:  %d", len(slice), cap(slice), slice)

でる:

lenght:  2 - capacity 5 - content:  [<nil> <nil>]
3
Benyamin Jafari