Di Go, apa perbedaan antara var s []int
dan s := make([]int, 0)
?
Saya menemukan bahwa keduanya berfungsi, tetapi mana yang lebih baik?
go
allocation
slice
Wang Yi
sumber
sumber
nil
irisan, sedangkan yang kedua membuatempty
irisan (ini adalah terminologi yang digunakan oleh "Go in action book" ). Untuk menghindari memposting jawaban yang sama di sini juga, Anda dapat memeriksa stackoverflow.com/a/45997533/1561148Jawaban:
Selain fabriziom 's jawaban , Anda dapat melihat lebih banyak contoh di ' Go Slices: penggunaan dan internal ', di mana penggunaan untuk
[]int
disebutkan:Artinya, untuk menambahkan potongan, Anda tidak harus mengalokasikan memori terlebih dahulu:
nil
potonganp int[]
tersebut sudah cukup sebagai potongan untuk ditambahkan.sumber
var p []int
lebih mudah daripada menggunakanmake
(yang lebih saya asosiasikan dengan alokasi, meskipun dengan 0 tutup, itu tidak akan mengalokasikan apa pun). Dalam hal keterbacaan, saya lebih suka tidak menggunakan dimake
sini.p := []int{}
). Karena kami biasanya menggunakan:=
sintaks untuk mendeklarasikan sebagian besar variabel, lebih alami untuk memilikinya di mana-mana daripada memiliki pengecualian untuk irisan. Selain itu, mencoba memikirkan alokasi biasanya mendorong orang ke pengoptimalan prematur.Deklarasi sederhana
tidak mengalokasikan memori dan
s
menunjuk kenil
, sementaramengalokasikan memori dan
s
menunjuk ke memori ke potongan dengan 0 elemen.Biasanya, yang pertama lebih idiomatis jika Anda tidak mengetahui ukuran pasti kasus penggunaan Anda.
sumber
make
peta, karena bahkan ruang kosong punmap
perlu dialokasikan untuk beberapa pembukuan.nil
jika slice Anda tidak memiliki elemen apa pun, bukan array kosong. Namun, jikamake
digunakan untuk membuat potongan, array kosong akan dikembalikan, yang umumnya merupakan efek yang diinginkan.var s []int
) akan menghasilkannull
, sementara menyusun irisan kosong (s := make([]int, 0)
) akan menghasilkan yang diharapkan[]
Baru saja menemukan perbedaan. Jika Anda menggunakan
dan kemudian Anda mengenkode keluaran sebagai JSON, Anda dapatkan
null
.menghasilkan
[]
seperti yang diharapkan.sumber
Sedikit lebih lengkap (satu argumen lagi
make
) contoh:Di luar:
Atau dengan tipe dinamis
slice
:Di luar:
sumber