Go Slices - Kapazität / Länge?

9

Versuchen zu lernen Gehen Sie jetzt aus dem Tutorial und haben Sie eine ziemlich grundlegende Frage:

%Vor%

Warum sieht c wie [0,0] aus und hat die Länge 2? b wurde ursprünglich nicht auf Null gesetzt, daher ist es [] . Also setzt c auf b[:2] die ersten beiden Elemente auf Null?

Auch warum ist die Kapazität von d 3? Sehr verwirrt.

Vielen Dank im Voraus.

    
Ryan Yu 18.04.2016, 00:56
quelle

1 Antwort

7

Alle Ihre Variablen haben einen Slicetyp . Slices verfügen über ein Array . In Go können Sie nicht auf nicht initialisierte Variablen zugreifen. Wenn Sie beim Erstellen einer neuen Variablen keinen expliziten Wert angeben, werden sie mit dem Nullwert des Variablentyp.

Das heißt, wenn Sie ein Segment mit make([]int, 0, 5) erstellen, erstellt es auch ein Backing-Array, das Backing-Array wird mit seinem Nullwert initialisiert und dieses zero-Array wird geschnitten . Der Nullwert eines Array-Typs ist ein Array mit dem Nullwert des Elementtyps für jedes seiner Elemente.

Auch wenn Sie nicht alle Elemente des Hintergrund-Arrays explizit auf 0 gesetzt haben, werden sie automatisch auf Null gesetzt. Wenn Sie also c := b[:2] ausführen, wird das Segment b geschnitten, und c hat die Länge 2, und diese 2 Elemente werden 0 sein.

Und wenn Sie d := c[2:5] bearbeiten, das den c Slice schneidet, ist seine Länge 5-2 = 3 , und seine Kapazität ist auch 5-2 = 3 , weil das Slicen eines Slices zu einem neuen Slice führt, den teilt das gleiche backing array , und die Kapazität ist das erste Element bis zum letzten des backing arrays (es sei denn, Sie verwenden einen full slice-Ausdruck , der auch die Kapazität des resultierenden Slices steuert).

Muss Blogeinträge für Neulinge lesen, die Slices und Arrays verstehen wollen:

Das Go-Blog: Go Slices: Verwendung und Interna

Das Go Blog: Arrays, Slices (und Strings): Die Mechanismen von 'append'

    
icza 18.04.2016 09:15
quelle

Tags und Links