Bu soruyu birkaç ay önce Go'yu araştırmaya başladığımda sordum. O zamandan beri her gün Go hakkında okuyorum ve Go'da kod yazıyorum.
Bu soruya net bir cevap alamadığım için (bir cevabı kabul etmiş olsam da), şimdi sorduğumdan beri öğrendiklerime dayanarak cevaplayacağım:
Go'da sabit kodlanmış dizi boyutu olmadan dizi / dilim oluşturmanın bir yolu var mı?
Evet. Dilimler, aşağıdakilerden sabit kodlanmış bir dizi gerektirmez slice:
var sl []int = make([]int,len,cap)
Bu kod ayırdığı dilim slboyutu, lenkapasiteli cap- lenve capzamanında atanabilir değişkenlerdir.
Neden list.Listgörmezden geliniyor?
Görünüşe göre list.ListGo'da çok az ilgi gören ana nedenler :
@Nick Craig-Wood'un cevabında açıklandığı gibi, dilimlerle, genellikle daha verimli ve daha temiz, daha zarif bir sözdizimi ile yapılamayan listelerle yapılabilecek neredeyse hiçbir şey yoktur. Örneğin, aralık yapısı:
for i:=range sl {
sl[i]=i
}
listeyle kullanılamaz - döngü için C stili gereklidir. Ve çoğu durumda, C ++ koleksiyon stili sözdizimi listelerle birlikte kullanılmalıdır:
push_backvb.
Belki daha da önemlisi, list.Listgüçlü bir şekilde yazılmamış - koleksiyonda çeşitli türleri karıştırmaya izin veren Python'un listeleri ve sözlüklerine çok benziyor. Bu, şeylere yönelik Go yaklaşımının tam tersi gibi görünüyor. Go, çok güçlü bir şekilde yazılmış bir dildir - örneğin, Go'da örtük tür dönüşümlerine hiçbir zaman izin verilmez, hatta bir upCast from intto int64açık olmalıdır. Ancak list.List için tüm yöntemler boş arayüzler alır - her şey gider.
Python'u terk edip Go'ya geçmemin nedenlerinden biri, Python'un "güçlü yazılmış" olduğunu iddia etmesine rağmen (IMO değil) Python'un tür sistemindeki bu tür zayıflıktır. Go list.List, C ++ 'lar vector<T>ve
Python'lardan doğan bir tür "melez" gibi görünüyor List()ve belki de Go'nun kendisinde biraz yerinde değil.
Çok uzak olmayan bir gelecekte bir noktada liste bulmamız beni şaşırtmaz. Liste, belki de kalmaya devam edecek olsa da, iyi tasarım uygulamaları kullanılsa bile bir sorunun en iyi şekilde çözülebileceği nadir durumlara uyum sağlamak için Go'da kullanımdan kaldırılmıştır. çeşitli türleri barındıran bir koleksiyonla. Ya da belki de C ailesi geliştiricilerinin, Go'ya özgü AFAIK'e özgü dilim nüanslarını öğrenmeden önce Go ile rahat olmaları için bir "köprü" sağlamak için oradadır. (Bazı açılardan dilimler C ++ veya Delphi'deki akış sınıflarına benziyor, ancak tamamen değil.)
Delphi / C ++ / Python arka planından gelmesine rağmen, Go ile ilk karşılaşmamda list.ListGo'nun dilimlerinden daha tanıdık buldum , Go ile daha rahat hale geldikçe, geri döndüm ve tüm listelerimi dilimlere dönüştürdüm. Henüz kullanmam gereken sliceve / veya mapyapmama izin vermeyen bir şey bulamadım list.List.
listtürünün bağlantılı bir liste kullanılarak uygulanmadığını unutmayın : Go dilimine benzer davranır ve bazen veri kopyalarının genişletilmesini gerektirir.