Heim >Backend-Entwicklung >Golang >Wie man Slices in Golang-Strukturen versteht

Wie man Slices in Golang-Strukturen versteht

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBnach vorne
2024-02-08 21:45:121003Durchsuche

如何理解 Golang 结构体中的切片

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.

Frageninhalt

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
}

Lösung

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]
Die Slice-Struktur bei

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

die Adresse der zugrunde liegenden Slice-Struktur, auf die indizes zeigt

0x1001 -> [indexes: 0x2001 (pointer to slice)]
0x2001 -> [length: 1, capacity: 1, data: 0x3001 (pointer to data)]
0x3001 -> [12]
Die Slice-Struktur bei 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]

Code 2:

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)
}

Ausgabe 2: 🎜
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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen