Slices in Arrays mit fester Größe in Go konvertieren
Ein häufiges Szenario in Go ist die Notwendigkeit, ein Slice in ein Array mit fester Größe zu konvertieren. Obwohl dies einfach erscheint, kann es zu einem Kompilierungsfehler führen. Um diesen Fehler und seine Lösung zu verstehen, analysieren wir den folgenden Codeausschnitt:
func gen(bricks []Brick) { if len(bricks) == 16 { if check(Sculpture{bricks}) { var b [16]Brick = bricks[0:16]; // This line generates the error } } }
Die Fehlermeldung weist darauf hin, dass das Slice-Objekt nicht direkt einem Array fester Größe zugewiesen werden kann. Dies liegt daran, dass Go Slices und Arrays als unterschiedliche Typen behandelt.
Lösung: Verwenden der Funktion „Kopieren“
Um ein Slice in ein Array fester Größe zu konvertieren, können Sie dies tun Verwenden Sie die integrierte Kopierfunktion. Diese Funktion verwendet zwei Slices als Eingabe und kopiert eine angegebene Anzahl von Elementen vom Quell-Slice in das Ziel-Slice. Durch die Bereitstellung der richtigen Eingaben können Sie die Elemente des Slice effektiv in das Array mit fester Größe übertragen.
Hier ist ein Beispiel, das die Verwendung von „Kopieren“ demonstriert:
slice := []byte("abcdefgh") var arr [4]byte copy(arr[:], slice[:4]) fmt.Println(arr) // Output: [97 98 99 100]
In diesem Fall , 'copy' überträgt die ersten vier Elemente des Slice in das Array 'arr'.
Alternative Syntax
Eine weitere prägnante Möglichkeit, mit „Kopieren“ das gleiche Ergebnis zu erzielen, besteht darin, die Slice-Indizes wegzulassen:
copy(arr[:], slice)
Die Funktion „Kopieren“ kopiert automatisch die Mindestanzahl von Elemente, die beide Slices aufnehmen können. Daher können Sie die Angabe der Indizes überspringen, wenn die Größen übereinstimmen oder wenn Sie das gesamte Array mit fester Größe füllen möchten.
Gehen Sie auf 1.17 und höher
Das ist erwähnenswert Go 1.17 führte die Unterstützung für Slice-zu-Array-Konvertierungen ein. Mit dieser Funktion können Sie einen Slice direkt einem Array-Zeiger desselben Basistyps zuweisen:
s := make([]byte, 2, 4) s0 := (*[0]byte)(s) // s0 != nil s1 := (*[1]byte)(s[1:]) // &s1[0] == &s[1] s2 := (*[2]byte)(s) // &s2[0] == &s[0]
Diese Funktionalität gilt jedoch noch als experimentell und ist möglicherweise nicht in allen Umgebungen verfügbar.
Das obige ist der detaillierte Inhalt vonWie konvertiere ich ein Slice in ein Array mit fester Größe in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!