Wie man Slices in Golang-Strukturen versteht

WBOY
Freigeben: 2024-02-08 21:45:12
nach vorne
927 Leute haben es durchsucht

如何理解 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)
}
Nach dem Login kopieren

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)
Nach dem Login kopieren

Was ist der Unterschied, wenn wir Folgendes definieren:

type deque struct {
    indexes *[]int
}
Nach dem Login kopieren

Lösung

Zum Beispiel lautet die Adresse der Deque-Instanz im Speicher 0x1001. Es wird initialisiert:

0x1001 -> [indexes: nil]
Nach dem Login kopieren

Wenn Sie ein neues Element hinzufügen (dq.push(12)):

0x1001 -> [length: 1, capacity: 1, data: 0x3001 (pointer to data)]
0x3001 -> [12]
Nach dem Login kopieren
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]).

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]
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

Ausgabe 1:

Deque elements: [12 34 56]
Nach dem Login kopieren
Nach dem Login kopieren

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]
Nach dem Login kopieren
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]
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

Ausgabe 2: 🎜
Deque elements: [12 34 56]
Nach dem Login kopieren
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!