2016-04-18 22 views
9
şu anda öğreticisindeki git öğrenmek ve oldukça basit bir sorum var çalışılıyor

:Git dilimleri - kapasite/uzunluk?

func main() { 
    a := make([]int, 5) 
    // [0,0,0,0,0] len=5 cap=5 

    b := make([]int, 0, 5) 
    // [] len=0 cap=5 

    c := b[:2] 
    // [0,0] len=2 cap=5 

    d := c[2:5] 
    // [0,0,0] len=3 cap=3 
} 

neden c[0,0] gibi görünüm ve sahip uzunluğu 2? b başlangıçta sıfır değildi, dolayısıyla []. c değerini b[:2] olarak ayarlamak ilk iki öğeyi sıfırlıyor mu?

Ayrıca, neden kapasitesi d 3? Çok karışık.

Şimdiden teşekkürler.

+3

Sen kullanışlı aşağıdaki makaleye bulabilirsiniz:

dilim anlamak istiyorum yeni gelenler ve diziler için blog yayınları basvurulacak https://blog.golang.org/ dilimler – kostya

+3

Son sorunuz için: kapasite, bir dilimin erişebileceği ilk öğe ile alttaki dizinin son öğesi arasındaki öğelerin sayısıdır. 'D' dilimine erişen ilk öğe, alttaki dizide 2. öğe, dolayısıyla kapasite 3'tür. – Akavall

+1

Olası çoğaltma [Dilimleme kapasitesinin azaltılması] (http://stackoverflow.com/questions/43294449/decreasing-slice-capacity) –

cevap

7

Tüm değişkenleriniz slice type'dir. Dilimlerin bir destek array var. Go'da başlatılmamış değişkenlere erişemezsiniz. Yeni bir değişken oluşturduğunuzda açıkça bir değer sağlamazsanız, değişkenin türünün zero value ile başlatılacaktır.

Bu, make([]int, 0, 5) ile bir dilim oluşturduğunuzda, aynı zamanda bir yedekleme dizisi oluşturur, yedekleme dizisi sıfır değeriyle başlatılacak ve bu sıfırlanmış dizi sliced olacaktır. Bir dizi tipinin sıfır değeri, elemanlarının her biri için sıfır eleman değerine sahip bir dizidir.

Bu nedenle, yedekleme dizisinin tüm öğelerini açıkça 0 olarak ayarlamamış olsanız bile, bunlar otomatik olarak sıfırlanır. Yani, c := b[:2] yaptığınızda, b dilimini dilimleyecek ve c, 2 uzunluğuna sahip olacak ve bu 2 öğe 0 olacaktır.

Ve c dilim dilim d := c[2:5] yaptığınızda, uzunluğu 5-2 = 3 olacak ve bir dilim dilimleme yeni dilim neden olacaktır çünkü onun kapasitesi de 5-2 = 3 olacak hisseleri aynı sırt dizisi ve kapasite Yedekleme dizisinin sonuna kadar olan ilk öğe olacaktır (sonuçta elde edilen dilimin kapasitesini de kontrol eden tam dilim ifadesi kullanmıyorsanız).

The Go Blog: Go Slices: usage and internals

The Go Blog: Arrays, slices (and strings): The mechanics of 'append'