2016-04-19 16 views
9

Lassen Sie uns sagen, dass ich die folgende Reihe von Ints der Länge 3:Wie erhält man das zugrunde liegende Array eines Slice in Go?

nums := [3]int{1,2,3}

Dann packe ich die Scheibe nur die ersten beiden Artikel

numSlice := nums[:2]

cap auf numSlice Aufrufen und nums ergibt in beiden Fällen 3 und len ergibt 2 bzw. 3.

Wenn ich dann zu diesem Slice (numSlice = append(numSlice, 10)) anhängen, ist das zugrunde liegende Array (nums) jetzt [1 2 10]. cap bleibt bei 3 für beide, wie die zugrunde liegende Anordnung der Schicht das gleiche ist, und len für die Scheibe ist nun 3.

Wenn jedoch I diese Scheibe wieder (numSlice = append(numSlice, 20)), die zugrunde liegende Anordnung der Scheibe append muss ändern - wir sehen das ist der Fall, wenn cap jetzt für numSlice verdoppelt hat und len ist jetzt 4.

Sorry für die übertriebene Erklärung, nur durch mich selbst gehen, aber kann mir jemand erklären, was passiert unter der Haube zu das zugrunde liegende Array und wie bekomme ich den Verweis auf das neue Array?

Antwort

13

Zuerst, wenn Sie noch nicht haben, sollten Sie this official blog post about slice internals lesen. Das sollte alles klären.

Um nun auf das zugrunde liegende Array zuzugreifen, können Sie eine Kombination aus reflect und unsafe verwenden. Insbesondere enthält reflect.SliceHeader ein Feld Data, das einen Zeiger auf das darunterliegende Array eines Slice enthält.

Beispiel aus der Dokumentation des unsafe Pakets angepasst:

s := []int{1, 2, 3, 4} 
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&s)) 
data := *(*[4]int)(unsafe.Pointer(hdr.Data)) 
+4

Dieser Beitrag ist auch hilfreich: http://blog.golang.org/slices – leeor

+2

Bemerkenswert, dass der 'Data' nicht zu dem Punkt, vielleicht Start des Backing-Arrays: nur zum 0-ten Element des Slices. Im Fall 'numSlice: = nums [1:]' würde es also tatsächlich auf das zweite Element des Arrays zeigen. [Beispiel] (http://play.golang.org/p/8fCCz9d7rG) – djd

+0

Als eine vielleicht dumme Frage, was wäre die Leistung dabei? – Highstead

Verwandte Themen