Golangでは、var s []int
とs := make([]int, 0)
の違いは何ですか?
私は両方ともうまくいくと思いますが、どちらが良いですか?
fabriziom の answer に加えて、「 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[]
で十分です。
簡単な宣言
var s []int
はメモリを割り当てず、s
はnil
をポイントしますが、
s := make([]int, 0)
メモリを割り当て、s
は、0個の要素を持つスライスへのメモリを指します。
通常、ユースケースの正確なサイズがわからない場合は、最初のものがより慣用的です。
違いが見つかりました。使用する場合
var list []MyObjects
そして、出力をJSONとしてエンコードすると、null
が得られます。
list := make([]MyObjects, 0)
期待どおり[]
になります。
もう少し完全に(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>]