Sobes.tech
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 string gibt 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)