In Golang ist eine Struktur ein benutzerdefinierter Datentyp, der mehrere Felder enthalten kann. In einer Struktur ist ein Slice ein dynamisches Array, das je nach Bedarf erweitert oder reduziert werden kann. Das Verständnis von Slices in Golang-Strukturen kann jedoch zu Verwirrung führen. In diesem Artikel erklärt Ihnen der PHP-Editor Youzi ausführlich das Funktionsprinzip und die Verwendung von Slices in der Golang-Struktur und hilft Ihnen, diese Funktion besser zu verstehen und anzuwenden. Egal, ob Sie Anfänger oder erfahrener Entwickler sind, dieser Artikel vermittelt Ihnen wertvolles Wissen und praktische Tipps, die Ihnen die Golang-Entwicklung erleichtern.
Ich bin neu bei Golang und versuche, Hinweise zu verstehen
type deque struct { indexes []int } func (d *deque) push(i int) { d.indexes = append(d.indexes, i) }
Der Index hier ist ein Slice und kein Zeiger auf einen Slice.
Wie werden Indizes eigentlich im Speicher gespeichert?
Zum Beispiel: Wenn wir eine Deque-Instanz starten, nennen wir sie dq, und im Speicher lautet die Adresse von dq 0x1001 (wir nennen sie adr(dq)).
Welche Variablen sind in adr(dq) gespeichert? Ist es ein Zeiger auf ein Array?
0x1001 -> Ox8009 (die Adresse des ersten Elements des Arrays)
Oder das Array selbst?
0x1001 -> Das erste Element des Slice
0x1002 -> Das zweite Element des Slice
Was passiert, wenn wir:
d.indexes = append(d.indexes, i)
Was ist der Unterschied, wenn wir Folgendes definieren:
type deque struct { indexes *[]int }
Zum Beispiel lautet die Adresse der Deque-Instanz im Speicher 0x1001
.
Es wird initialisiert:
0x1001 -> [indexes: nil]
Wenn Sie ein neues Element hinzufügen (dq.push(12)
):
0x1001 -> [length: 1, capacity: 1, data: 0x3001 (pointer to data)] 0x3001 -> [12]
0x1001
enthält Informationen über die Slice-Länge und -Kapazität (Länge: 1, Kapazität: 1), die eigentlichen Daten werden an einer anderen Adresse gespeichert (sagen wir 0x3001, Array[12]). p>
Beim Drücken anderer Elemente (dq.push(34)、dq.push(56)
).
0x1001 -> [length: 3, capacity: 4, data: 0x5001 (new pointer to data due to capacity, capacity doubles)] 0x5001 -> [12, 34, 56]
Code 1:
type deque struct { indexes []int } func (d *deque) push(i int) { d.indexes = append(d.indexes, i) } func main() { dq := deque{} dq.push(12) dq.push(34) dq.push(56) fmt.Println("Deque elements:", dq.indexes) }
Ausgabe 1:
Deque elements: [12 34 56]
Bei Verwendung von Zeigern auf Slices (*[]int)
而不是切片本身 ([]int)
. Das bedeutet, dass das Indexfeld einen Zeiger auf das Slice enthält und dieser Zeiger vor seiner Verwendung initialisiert werden muss.
Wenn Sie ein neues Element hinzufügen (dq.push(12)
),则0x2001
就是indexes
), dann ist
indizes
zeigt
0x1001 -> [indexes: 0x2001 (pointer to slice)] 0x2001 -> [length: 1, capacity: 1, data: 0x3001 (pointer to data)] 0x3001 -> [12]
0x2001
enthält die Längen- und Kapazitätsinformationen des Slice (Länge: 1, Kapazität: 1), und die tatsächlichen Daten werden an einer anderen Adresse (0x3001, Array[12]) gespeichert.
dq.push(34)、dq.push(56)
Beim Drücken anderer Elemente (
0x1001 -> [indexes: 0x2001 (pointer to slice)] 0x2001 -> [length: 3, capacity: 4, data: 0x5001 (new data pointer, due to capacity, capacity doubles)] 0x5001 -> [12, 34, 56]
type deque struct { indexes *[]int } func (d *deque) push(i int) { if d.indexes == nil { // initialize the slice if it's nil d.indexes = &[]int{} } *d.indexes = append(*d.indexes, i) } func main() { dq := deque{} dq.push(12) dq.push(34) dq.push(56) fmt.Println("Deque elements:", *dq.indexes) }
Deque elements: [12 34 56]
Das obige ist der detaillierte Inhalt vonWie man Slices in Golang-Strukturen versteht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!