web-dev-qa-db-ja.com

空のスライスを初期化する正しい方法

固定サイズではない空のスライスを宣言するには、次のようにします。

mySlice1 := make([]int, 0)

または

mySlice2 := []int{}

どちらが正しい方法なのか疑問に思います。

165
eouti

あなたが与えた2つの選択肢は意味的に同一であり、私はそれらが同じアセンブリ命令を生成すると思います。

不必要な割り当てを避けるために、スライスを使用しないことになった場合に備えて、nil値を付けておくことができます。

var myslice []int

Golang.orgブログに書かれているように

nilスライスは、何も指していなくても機能的に長さゼロのスライスと同等です。それは長さゼロを持ち、割り当てと共に追加することができます。

209
ANisus

それらは同等です。このコードを見なさい:

mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))

出力:

mySlice1 0
mySlice2 0

両方のスライスは0容量を持ち、これは両方のスライスが0長さを持つことを意味し(容量を超えることはできません)、これは両方のスライスが要素を持たないことを意味します。これは、2つのスライスがあらゆる点で同一であることを意味します。

同様の質問を参照してください。

ゴランに空のスライスと空のスライスがあることの意味は何ですか?

Go言語のnilスライスとnon-nilスライスと空のスライス

49
icza

@ ANisus ' の回答に追加として...

以下は、 "行動を起こす"の本からの情報です。

nilスライスとemptyスライスの違い

このようなスライスを考えると:

[pointer] [length] [capacity]

その後:

nil slice:   [nil][0][0]
empty slice: [addr][0][0] // points to an address

無スライス

スライスを返す関数で例外が発生した場合など、存在しないスライスを表現したい場合に便利です。

// Create a nil slice of integers.
var slice []int

空のスライス

空のスライスは、データベースクエリがゼロの結果を返す場合のように、空のコレクションを表す場合に役立ちます。

// Use make to create an empty slice of integers.
slice := make([]int, 0)

// Use a slice literal to create an empty slice of integers.
slice := []int{}

Nilスライスと空のスライスのどちらを使用する場合でも、組み込み関数appendlen、およびcapは同じように機能します。


遊び場の例を見る

package main

import (
    "fmt"
)

func main() {

    var nil_slice []int
    var empty_slice = []int{}

    fmt.Println(nil_slice == nil, len(nil_slice), cap(nil_slice))
    fmt.Println(empty_slice == nil, len(empty_slice), cap(empty_slice))

}

プリント:

true 0 0
false 0 0
31
tgogos

空のスライスとnilスライスは、Goでは異なる方法で初期化されます。

var nilSlice []int 
emptySlice1 := make([]int, 0)
emptySlice2 := []int{}

fmt.Println(nilSlice == nil)    // true
fmt.Println(emptySlice1 == nil) // false
fmt.Println(emptySlice2 == nil) // false

3つのスライスすべてについて、lenとcapは0です。

11
Joe.CK