Go'da var s []int
ve arasındaki fark s := make([]int, 0)
nedir?
Her ikisinin de işe yaradığını görüyorum ama hangisi daha iyi?
Yanıtlar:
Ek olarak fabriziom 'ın cevabı , siz 'daha fazla örnek görebilirsiniz : kullanımı ve iç görün Git dilimleri için bir kullanım' []int
söz edilir:
Bir dilimin (
nil
) sıfır değeri, sıfır uzunluklu bir dilim gibi davrandığından , bir dilim değişkeni bildirebilir ve ardından ona bir döngü içinde ekleyebilirsiniz:
// 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
}
Bu, bir dilime eklemek için önce bellek ayırmanız gerekmediği anlamına gelir: dilim, eklemek için bir nil
dilim p int[]
olarak yeterlidir.
var p []int
kullanmaktan daha kolay buluyorum make
(ki bunu daha çok ayırmayla ilişkilendiriyorum, 0 sınırı olsa bile hiçbir şey tahsis etmiyor). Okunabilirlik açısından make
burayı kullanmamayı tercih ediyorum .
p := []int{}
). :=
Çoğu değişkeni bildirmek için genellikle sözdizimi kullandığımızdan , dilimler için istisnalar koymak yerine her yerde bulundurmak daha doğaldır. Bunun dışında tahsisleri düşünmeye çalışmak insanları genellikle erken optimizasyonlara itiyor.
Basit beyan
var s []int
bellek ve ayırmaz s
puan nil
olurken,
s := make([]int, 0)
hafızayı tahsis eder ve s
hafızaya 0 elemanlı bir dilime işaret eder.
Kullanım durumunuzun tam boyutunu bilmiyorsanız, genellikle ilki daha deyimseldir.
make
haritalara ihtiyacınız var , çünkü boş bir map
yer bile bir miktar muhasebe için ayrılmış alana ihtiyaç duyar.
nil
diliminizin boş bir dizi yerine herhangi bir öğesi olmaması durumunda bildirim temelli formun kullanılması döndürülür . Bununla birlikte, make
dilimi oluşturmak için kullanılırsa, bunun yerine genellikle istenen efekt olan boş bir dizi döndürülür.
var s []int
) üretecek null
, boş dilimi sıralamak ( s := make([]int, 0)
) ise beklenen[]
Sadece bir fark buldum. Eğer kullanırsan
var list []MyObjects
ve sonra çıktıyı JSON olarak kodlarsınız null
.
list := make([]MyObjects, 0)
[]
beklendiği gibi sonuçlanır .
Biraz daha eksiksiz (bir argüman daha var make
) örnek:
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Dışarı:
length: 2 - capacity 5 - content: [0 0]
Veya dinamik tipte slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Dışarı:
length: 2 - capacity 5 - content: [<nil> <nil>]
nil
dilim oluşturur , ikincisi ise birempty
dilim oluşturur (bu "Harekete geçme kitabı" tarafından kullanılan terminolojidir ). Aynı cevabı buraya da göndermekten kaçınmak için, stackoverflow.com/a/45997533/1561148