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 stringpř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)