Sobes.tech
Middle

Jak jsou řetězce uspořádány v programovacím jazyce Go?

sobes.tech AI

Odpověď od AI

Řetězec v Go je neměnná posloupnost bytů.

Klíčové vlastnosti:

  • Neměnnost: po vytvoření nelze řetězec změnit.
  • Zobrazení: je uložen jako ukazatel a délka. Ukazatel ukazuje na první byte sekvence v paměti. Délka je počet bytů.
  • Kódování: řetězce v Go neobsahují informace o kódování. Často se používají k ukládání UTF-8, ale mohou obsahovat jakékoli byty.
  • Iterace přes byty: cyklus for index, value range string při iteraci přes řetězec vrací index a rune (int32), nikoli byte.
  • Iterace přes runy: rune představuje Unicode code point. Go používá UTF-8, takže jedna rune může zabírat od 1 do 4 bytů.
  • Získání podřetězce: operace řezu string[start:end] vytvoří nový řetězec ukazující na stejnou oblast paměti, ale s jinými hranicemi.

Příklady:

// Deklarace a inicializace
var s string
s = "Привет" // Literál řetězce v Go - posloupnost bytů,
             // obvykle interpretováno jako UTF-8

// Délka řetězce v bytech
byteLength := len(s) // 12, protože "П", "р", "и", "в", "е", "т" jsou multibyte znaky v UTF-8

// Iterace přes runy
runeCount := 0
for index, runeValue := range s {
    // index - index začátku runy v bytech
    // runeValue - hodnota runy (int32)
    _ = index // použití anonymního _ pro nepoužívané proměnné
    // fmt.Printf("Index: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
    runeCount++
}
// runeCount bude 6

// Iterace přes byty
byteCount := 0
for i := 0; i < len(s); i++ {
    // s[i] - byte na indexu i
    _ = s[i] // použití anonymního _
    // fmt.Printf("Byte na indexu %d: %d\n", i, s[i])
    byteCount++
}
// byteCount bude 12

// Získání podřetězce (řezu bytů)
// Důležité: řez bytů může přerušit multibyte rune
// sub := s[0:5] // To může být neplatná UTF-8 sekvence

// Použití balíčků strings nebo unicode/utf8 pro bezpečnou práci s runami

Porovnání s řezem bytů ([]byte):

Charakteristika String []byte
Měnitelnost Ne Ano
Zobrazení Ukazatel + Délka Ukazatel + Délka + Kapacita
Typ Vestavěný primitiv Slice (řez)
Použití Nezměnitelný text Měnitelné data (byty)

Konverze mezi string a []byte:

// string -> []byte
byteSlice := []byte(s)

// []byte -> string
newString := string(byteSlice)