Detaillierte Einführung in die Implementierungsprinzipien und die allgemeine Verwendung von Golang Slice

PHPz
Freigeben: 2023-04-05 13:54:42
Original
763 Leute haben es durchsucht

Slice in der Go-Sprache ist eine dynamische Sequenz, die auf der Array-Implementierung basiert, ihre Größe zur Laufzeit dynamisch vergrößern oder verkleinern kann und allgemeine Vorgänge für segmentierte Daten unterstützt, wie z. B. Anhänge-, Einfüge-, Spleiß-, Kopier- und Slice-Vorgänge. In diesem Artikel werden die Implementierungsprinzipien und die allgemeine Verwendung von Slice ausführlich vorgestellt.

1. Slice-Datenstruktur

In der Go-Sprache besteht die Slice-Datenstruktur aus drei Teilen: Zeiger auf das zugrunde liegende Array, Slice-Länge und Slice-Kapazität. Die spezifische Definition lautet wie folgt:

Typ-Slice-Struktur {

ptr *int  // 指向 slice 引用的底层数组
len int   // slice 的长度
cap int   // slice 的容量
Nach dem Login kopieren

}

Unter diesen zeigt der Zeiger ptr auf die Startposition des zugrunde liegenden Arrays, len repräsentiert die Länge des Slice und cap repräsentiert die Kapazität des Scheibe. Die Länge des Slice stellt die Anzahl der aktuell im Slice gespeicherten Elemente dar, und die Kapazität des Slice stellt die Anzahl der Elemente dar, die im aktuell zugrunde liegenden Array gespeichert werden können.

2. Initialisierung von Slice

In der Go-Sprache gibt es zwei Möglichkeiten, ein Slice zu erstellen: Verwenden Sie die integrierte Funktion make(), um ein Slice zu erstellen, oder verwenden Sie ein Slice-Literal, um ein Slice direkt zu deklarieren und zu initialisieren.

Verwenden Sie die integrierte Funktion make(), um ein Slice zu erstellen:

slice := make([]Typ, Länge, Kapazität)

Die Funktion make() erstellt ein zugrunde liegendes Array und gibt ein Slice zurück, das auf das zeigt Array mit seinen Parametern Stellt jeweils den Typ des Slice-Elements, die Länge des Slice und die Kapazität des Slice dar. Unter diesen kann die Slice-Kapazität weggelassen werden. Wenn sie weggelassen wird, wird standardmäßig die gleiche Länge verwendet, was darauf hinweist, dass das Slice keinen freien Speicherplatz hat.

Verwenden Sie Slice-Literale, um Slices zu deklarieren und zu initialisieren:

slice := []type{elements}

Die durch Slice-Literale erstellten Slices müssen die Länge und Kapazität nicht angeben. Die Go-Sprache berechnet sie automatisch basierend auf Anzahl der Elemente im Slice. Die Länge und Kapazität des Slice.

3. Grundlegende Operationen von Slice

Verwenden Sie den Indexoperator [], um das Element mit dem angegebenen Index im Slice abzurufen. Der Index beginnt bei 0 und kann ein Maximum von len erreichen -1. Zum Beispiel:

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

fmt.Println(slice[0]) // Ausgabe: 1


2. Slice-Traversal

kann mit der for-Schleife und dem Schlüsselwort range durchlaufen werden Elemente im Slice. Zum Beispiel:

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

für Index, Wert := Bereich Slice {

fmt.Printf("index:%d value:%d\n", index, value)
Nach dem Login kopieren

}

3 Elemente an Slice anhängen

Verwenden Sie die integrierte Funktion append( ) Elemente an Slice anhängen. Die Funktion append() gibt ein neues Slice zurück und das ursprüngliche Slice wird nicht geändert. Zum Beispiel:

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

slice2 := append(slice1, 4, 5)

fmt.Println(slice1) // Ausgabe: [1 2 3]
fmt.Println ( Slice2) // Ausgabe: [1 2 3 4 5]

4. Slice kopieren

Verwenden Sie die integrierte Funktion copy(), um ein Slice in ein anderes Slice zu kopieren. Zum Beispiel:

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

slice2 := make([]int, len(slice1))

copy(slice2, Slice1)
fmt.Println(slice2) // Ausgabe : [1 2 3]

5. Verwenden Sie den Slice-Operator [:], um das Slice beginnend mit dem angegebenen Index zu segmentieren. Das Ergebnis des Slicings ist ein neues Slice, und das ursprüngliche Slice wird nicht geändert. Zum Beispiel:

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

slice2 := Slice1[1:]

fmt.Println(slice2) // Ausgabe: [2 3]

4

Slice in der Go-Sprache ist eine dynamische Sequenz, die auf Arrays basiert. Wenn ein Slice erstellt wird, erstellt die Go-Sprache ein Array und zeigt den ptr des Slice auf die Startposition des Arrays. Anfänglich beträgt die Länge des Slice 0 und die Kapazität entspricht der Länge des zugrunde liegenden Arrays. Wenn append() aufgerufen wird, um ein Element anzuhängen, prüft die Go-Sprache, ob die Kapazität des aktuellen Slice ausreicht, um das neue Element zu speichern. Wenn dies ausreicht, fügt sie das neue Element direkt am Ende des aktuellen Slice hinzu Wenn dies nicht ausreicht, wird ein größeres Array neu zugewiesen, die Elemente im aktuellen Slice in das neue Array kopiert und dann die neuen Elemente angehängt. Wenn die Kapazität des Slice nicht ausreicht, ändert sich daher das zugrunde liegende Array, was sich auf alle Slices auswirkt, die auf das Array verweisen.

Beim Schneiden eines Slice erstellt die Go-Sprache ein neues Slice und zeigt ptr auf die Startposition des Slice im ursprünglichen Array. Die Länge und Kapazität des Slice werden durch den Slice-Operator [:] und die Parameter beim Erstellen des Slice bestimmt. Daher wird beim Slicing kein neues Array erstellt, sondern das ursprüngliche Array wiederverwendet.

5. Zusammenfassung

In diesem Artikel werden die Implementierungsprinzipien und die allgemeine Verwendung von Slice in der Go-Sprache vorgestellt. Slice ist eine wichtige Datenstruktur zur Realisierung dynamischer Sequenzen in der Go-Sprache Daten variabler Länge. Wenn Sie die Verwendungsfähigkeiten und Implementierungsprinzipien von Slice beherrschen, können Sie Go-Programme effizienter schreiben und die Codeleistung optimieren.

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Implementierungsprinzipien und die allgemeine Verwendung von Golang Slice. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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