Anda mengatakan "ukuran tidak tetap", tetapi irisan tidak pernah memiliki ukuran tetap. Kecuali Anda maksud dengan kapasitas nol. Catatan, jika Anda memiliki ide / tebak / petunjuk tentang kapasitas apa yang mungkin Anda butuhkan maka menggunakan versi tiga argumen itu bagus. Misalnya untuk membangun sepotong kunci peta:keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }
Dua alternatif yang Anda berikan identik secara semantik, tetapi menggunakan make([]int, 0)akan menghasilkan panggilan internal ke runtime.makeslice (Go 1.14).
Anda juga memiliki opsi untuk memberikan nilnilai:
irisan nil secara fungsional setara dengan irisan panjang-nol, meskipun tidak menunjukkan apa-apa. Panjangnya nol dan dapat ditambahkan, dengan alokasi.
Sebuah nilslice akan tetapi json.Marshal()menjadi "null"sedangkan irisan kosong akan marshal ke"[]" , seperti yang ditunjukkan oleh @farwayer.
Tak satu pun dari opsi di atas akan menyebabkan alokasi apa pun, seperti yang ditunjukkan oleh @ArmanOrdookhani.
Hati-hati: json.Marshal()akan kembali nulluntuk var myslice []intdan []untuk potongan yang diinisialisasimyslice := []int{}
farwayer
10
Juga berhati-hati: reflect.DeepEqualmembuat perbedaan antara irisan nihil dan irisan non-nihil: a := []int{}, var b []int,reflect.DeepEqual(a, b) // returns false
asgaines
1
Mengapa Anda pikir itu akan melakukan alokasi? Cap adalah nol sehingga tidak ada yang dialokasikan. Semua petunjuk ke titik panjang menunjuk ke lokasi yang sama di memori: play.golang.org/p/MPOKKl_sYvw
Arman Ordookhani
1
@ArmanOrdookhani Anda benar. Saya mencobanya, dan saya juga menemukan bahwa saya salah dengan asumsi saya tentang instruksi perakitan yang sama. Tetap!
Kedua irisan memiliki 0 kapasitas yang berarti kedua irisan memiliki0 panjang (tidak bisa lebih besar dari kapasitas) yang menyiratkan kedua irisan tidak memiliki elemen. Ini berarti 2 irisan identik dalam setiap aspek.
make([]int, 0)adalah yang terbaik karena Jetbrains GoLand tidak mengeluh tentang hal itu menjadi "tidak perlu" seperti dalam kasus []int{}. Ini berguna dalam penulisan unit test.
keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }
Jawaban:
Dua alternatif yang Anda berikan identik secara semantik, tetapi menggunakan
make([]int, 0)
akan menghasilkan panggilan internal ke runtime.makeslice (Go 1.14).Anda juga memiliki opsi untuk memberikan
nil
nilai:Seperti yang tertulis di blog Golang.org :
Sebuah
nil
slice akan tetapijson.Marshal()
menjadi"null"
sedangkan irisan kosong akan marshal ke"[]"
, seperti yang ditunjukkan oleh @farwayer.Tak satu pun dari opsi di atas akan menyebabkan alokasi apa pun, seperti yang ditunjukkan oleh @ArmanOrdookhani.
sumber
json.Marshal()
akan kembalinull
untukvar myslice []int
dan[]
untuk potongan yang diinisialisasimyslice := []int{}
reflect.DeepEqual
membuat perbedaan antara irisan nihil dan irisan non-nihil:a := []int{}
,var b []int
,reflect.DeepEqual(a, b) // returns false
Mereka setara. Lihat kode ini:
Keluaran:
Kedua irisan memiliki
0
kapasitas yang berarti kedua irisan memiliki0
panjang (tidak bisa lebih besar dari kapasitas) yang menyiratkan kedua irisan tidak memiliki elemen. Ini berarti 2 irisan identik dalam setiap aspek.Lihat pertanyaan serupa:
Apa gunanya memiliki potongan nihil dan potongan kosong di golang?
irisan nil vs irisan non-nil vs irisan kosong dalam bahasa Go
sumber
Sebagai tambahan untuk @ANisus jawaban ...
di bawah ini adalah beberapa informasi dari "Bertindak" , yang menurut saya layak disebutkan:
Perbedaan antara
nil
&empty
irisanJika kita memikirkan irisan seperti ini:
kemudian:
Go playground contoh :
cetakan:
sumber
make
?make
sepertinya tidak mengembalikan alamat. Saya percaya Anda tidak dapat melakukannya dalam satu langkah.Iris kosong dan irisan nil diinisialisasi secara berbeda di Go:
Adapun ketiga irisan, len dan cap adalah 0.
sumber
make([]int, 0)
adalah yang terbaik karena Jetbrains GoLand tidak mengeluh tentang hal itu menjadi "tidak perlu" seperti dalam kasus[]int{}
. Ini berguna dalam penulisan unit test.