回答:
あなたが与えた2つの選択肢は意味的に同じですが、使用make([]int, 0)
するとruntime.makesliceへの内部呼び出しが発生します(Go 1.14)。
また、nil
値を残すこともできます。
var myslice []int
Golang.orgブログに書かれているように:
nilスライスは、何も指していない場合でも、機能的に長さゼロのスライスと同等です。長さはゼロで、割り当てにより追加できます。
nil
スライスしかしうjson.Marshal()
に"null"
、空のスライス一方にマーシャリングう"[]"
@farwayerにより指摘したように、。
@ArmanOrdookhaniによって指摘されているように、上記のオプションのいずれも割り当てを引き起こしません。
json.Marshal()
返されるnull
ためvar myslice []int
と[]
初期化されたスライスのためにmyslice := []int{}
reflect.DeepEqual
nilのスライスと非nilのスライスの区別が作る:a := []int{}
、var b []int
、reflect.DeepEqual(a, b) // returns false
それらは同等です。このコードを参照してください:
mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))
出力:
mySlice1 0
mySlice2 0
両方のスライスに0
容量があるため、両方のスライスに0
長さがあり(容量を超えることはできません)、両方のスライスに要素がないことを意味します。つまり、2つのスライスはすべての面で同一です。
同様の質問を参照してください:
@ANisusの回答への追加として...
以下は、言及する価値があると思う"Go in action"の本からの情報です。
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
make
か?
make
アドレスを返すようには見えません。あなたは一歩でそれを行うことはできないと思います。
Goで空のスライスとnilスライスは異なる方法で初期化されます。
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です。
make([]int, 0)
Jetbrains GoLandは、の場合のように「不要」であると文句を言わないので、最高です[]int{}
。これは、単体テストの作成に役立ちます。
keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }