固定サイズではない空のスライスを宣言するには、次のようにします。
mySlice1 := make([]int, 0)
または
mySlice2 := []int{}
どちらが正しい方法なのか疑問に思います。
あなたが与えた2つの選択肢は意味的に同一であり、私はそれらが同じアセンブリ命令を生成すると思います。
不必要な割り当てを避けるために、スライスを使用しないことになった場合に備えて、nil
値を付けておくことができます。
var myslice []int
nilスライスは、何も指していなくても機能的に長さゼロのスライスと同等です。それは長さゼロを持ち、割り当てと共に追加することができます。
それらは同等です。このコードを見なさい:
mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))
出力:
mySlice1 0
mySlice2 0
両方のスライスは0
容量を持ち、これは両方のスライスが0
長さを持つことを意味し(容量を超えることはできません)、これは両方のスライスが要素を持たないことを意味します。これは、2つのスライスがあらゆる点で同一であることを意味します。
同様の質問を参照してください。
@ 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スライスと空のスライスのどちらを使用する場合でも、組み込み関数
append
、len
、および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
空のスライスと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です。