Jawaban:
Selain fabriziom 's jawaban , Anda dapat melihat lebih banyak contoh di ' Go Slices: penggunaan dan internal ', di mana penggunaan untuk []int
disebutkan:
Karena nilai nol dari sebuah slice (
nil
) bertindak seperti potongan dengan panjang nol , Anda dapat mendeklarasikan variabel slice dan kemudian menambahkannya ke dalam satu putaran:
// 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
}
Artinya, untuk menambahkan potongan, Anda tidak harus mengalokasikan memori terlebih dahulu: nil
potongan p int[]
tersebut sudah cukup sebagai potongan untuk ditambahkan.
var p []int
lebih mudah daripada menggunakan make
(yang lebih saya asosiasikan dengan alokasi, meskipun dengan 0 tutup, itu tidak akan mengalokasikan apa pun). Dalam hal keterbacaan, saya lebih suka tidak menggunakan di make
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
var s []int
tidak mengalokasikan memori dan s
menunjuk ke nil
, sementara
s := make([]int, 0)
mengalokasikan 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.
make
peta, karena bahkan ruang kosong pun map
perlu dialokasikan untuk beberapa pembukuan.
nil
jika slice Anda tidak memiliki elemen apa pun, bukan array kosong. Namun, jika make
digunakan untuk membuat potongan, array kosong akan dikembalikan, yang umumnya merupakan efek yang diinginkan.
var s []int
) akan menghasilkan null
, sementara menyusun irisan kosong ( s := make([]int, 0)
) akan menghasilkan yang diharapkan[]
Baru saja menemukan perbedaan. Jika Anda menggunakan
var list []MyObjects
dan kemudian Anda mengenkode keluaran sebagai JSON, Anda dapatkan null
.
list := make([]MyObjects, 0)
menghasilkan []
seperti yang diharapkan.
Sedikit lebih lengkap (satu argumen lagi make
) contoh:
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Di luar:
length: 2 - capacity 5 - content: [0 0]
Atau dengan tipe dinamis slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Di luar:
length: 2 - capacity 5 - content: [<nil> <nil>]
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/1561148