Jawaban:
Selain fabriziom 's jawaban , Anda dapat melihat lebih banyak contoh di ' Go Slices: penggunaan dan internal ', di mana penggunaan untuk []intdisebutkan:
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: nilpotongan p int[]tersebut sudah cukup sebagai potongan untuk ditambahkan.
var p []intlebih 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 makesini.
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 smenunjuk ke nil, sementara
s := make([]int, 0)
mengalokasikan memori dan smenunjuk ke memori ke potongan dengan 0 elemen.
Biasanya, yang pertama lebih idiomatis jika Anda tidak mengetahui ukuran pasti kasus penggunaan Anda.
makepeta, karena bahkan ruang kosong pun mapperlu dialokasikan untuk beberapa pembukuan.
niljika slice Anda tidak memiliki elemen apa pun, bukan array kosong. Namun, jika makedigunakan 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>]
nilirisan, sedangkan yang kedua membuatemptyirisan (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