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 sl
boyutu, len
kapasiteli cap
- len
ve cap
zamanında atanabilir değişkenlerdir.
Neden list.List
görmezden geliniyor?
Görünüşe göre list.List
Go'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_back
vb.
Belki daha da önemlisi, list.List
güç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 int
to int64
açı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.List
Go'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 slice
ve / veya map
yapmama izin vermeyen bir şey bulamadım list.List
.
list
tü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.