Middle
Wie sind Strings in der Programmiersprache Go aufgebaut?
sobes.tech KI
Antwort von AI
Eine Zeichenkette in Go ist eine unveränderliche Sequenz von Bytes.
Wichtige Merkmale:
- Unveränderlichkeit: Nach der Erstellung kann die Zeichenkette nicht mehr geändert werden.
- Darstellung: Wird als Zeiger und Länge gespeichert. Der Zeiger zeigt auf das erste Byte der Sequenz im Speicher. Die Länge ist die Anzahl der Bytes.
- Kodierung: Zeichenketten in Go enthalten keine Informationen über die Kodierung. Sie werden häufig zur Speicherung von UTF-8 verwendet, können aber beliebige Bytes enthalten.
- Iteration über Bytes: Die Schleife
for index, value range stringgibt beim Iterieren über eine Zeichenkette den Index und die Rune (int32) zurück, nicht das Byte. - Iteration über Runen: Eine Rune stellt einen Unicode-Codepunkt dar. Go verwendet UTF-8, daher kann eine Rune zwischen 1 und 4 Bytes belegen.
- Unterzeichenkette erhalten: Die Slice-Operation
string[start:end]erstellt eine neue Zeichenkette, die auf denselben Speicherbereich zeigt, aber mit anderen Grenzen.
Beispiele:
// Deklaration und Initialisierung
var s string
s = "Привет" // String-Literal in Go - Sequenz von Bytes,
// wird meist als UTF-8 interpretiert
// Länge der Zeichenkette in Bytes
byteLength := len(s) // 12, da "П", "р", "и", "в", "е", "т" mehrbyte-Zeichen in UTF-8 sind
// Iteration über Runen
runeCount := 0
for index, runeValue := range s {
// index - Index des Rune-Anfangs in Bytes
// runeValue - Wert der Rune (int32)
_ = index // Verwendung eines anonymen Platzhalters _ für ungenutzte Variablen
// fmt.Printf("Index: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
runeCount++
}
// runeCount wird 6 sein
// Iteration über Bytes
byteCount := 0
for i := 0; i < len(s); i++ {
// s[i] - Byte bei Index i
_ = s[i] // Verwendung eines anonymen Platzhalters
// fmt.Printf("Byte bei Index %d: %d\n", i, s[i])
byteCount++
}
// byteCount wird 12 sein
// Unterzeichenkette erhalten (Byte-Schnitt)
// Wichtig: Byte-Schnitt kann eine mehrbyte-Rune zerreißen
// sub := s[0:5] // Das kann eine ungültige UTF-8-Sequenz sein
// Verwendung der Pakete strings oder unicode/utf8 für sichere Arbeit mit Runen
Vergleich mit Byte-Schnitt ([]byte):
| Merkmal | String | []byte |
|---|---|---|
| Änderbarkeit | Nein | Ja |
| Darstellung | Zeiger + Länge | Zeiger + Länge + Kapazität |
| Typ | Eingebauter Primitive | Slice (Schnitt) |
| Verwendung | Unveränderlicher Text | Änderbare Daten (Bytes) |
Konvertierung zwischen string und []byte:
// string -> []byte
byteSlice := []byte(s)
// []byte -> string
newString := string(byteSlice)