2016-03-24 5 views
0

Die folgende go Code:Die "Cap" von Golang

var numbers4 = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 
slice := numbers4[4:6:8] 
fmt.Printf("%d\n", cap(slice)) 

Warum ist cap(slice) gleich 4?

Ich dachte, dass sollte 2 sein.

+0

[Ist diese Antwort?] (Https://stackoverflow.com/questions/17500282/is-working-past-the-end-of-a-slice-idiomatic) Sollte es ein Duplikat in Betracht gezogen werden? –

+0

Vielleicht kein Duplikat, aber die Antwort, auf die Sie verlinken, ist auch sehr informativ. Vielen Dank. Ich stimme dem Responder zu, dass Programmierer wissen sollten, wie Slices implementiert sind. Slices sind ein sehr leistungsfähiger Programmiermechanismus und kommen auf viele verschiedene Arten zum Einsatz. – WeakPointer

Antwort

3

Die Kapazität ist die Anzahl der Elemente im zugrunde liegenden Array (beginnend mit dem Element, auf das der Slice-Zeiger verweist).

von Go Slices: usage and internals.

Grundsätzlich bedeutet es cap! = Len.
Also die Scheibe beginnt bei # 4 und endet bei # 8, daher ist die Kappe 8 - 4 = 4.

+0

Danke, es hilft mir sehr –

4

numbers4[4:6:8] ist eine full slice expression:

Für ein Array, Zeiger auf Array oder slice a (aber kein String), den Primärausdruck

a[low : high : max] 

ein Stück von der gleichen Art konstruiert und mit der gleichen Länge und den gleichen Elementen wie der einfache Schnittausdruck a[low : high]. Darüber hinaus steuert es die Kapazität des resultierenden Schnitts, indem es auf max - low setzt.

Die Spezifikation sagt der volle Scheibe Ausdruck der Kapazität steuert, um es zu max - low begrenzen, was in Ihrem Fall 8 - 4 = 4 ist.

Die Kapazität nicht die „extra“ Elemente ist, von denen die Scheibe verlängert werden kann, ist die Fähigkeit, die maximale Länge, um die eine Scheibe verlängert werden kann, die aktuelle Länge + zusätzliche Elemente über die Länge aufweist.

slice := numbers4[4:6:8] 

len(slice) = 6 - 4 = 2 
cap(slice) = 8 - 4 = 4