Middle
Ako sú reťazce usporiadané v programovacom jazyku Go?
sobes.tech AI
Odpoveď od AI
Reťazec v Go je nemenná sekvencia bajtov.
Kľúčové vlastnosti:
- Nemennosť: po vytvorení sa reťazec nemôže zmeniť.
- Predstavenie: je uložený ako ukazovateľ a dĺžka. Ukazovateľ ukazuje na prvý bajt sekvencie v pamäti. Dĺžka je počet bajtov.
- Kódovanie: reťazce v Go neobsahujú informácie o kódovaní. Často sa používajú na uloženie UTF-8, ale môžu obsahovať akékoľvek bajty.
- Iterácia po bajtoch: cyklus
for index, value range stringpri iterácii po reťazci vracia index a ruinu (int32), nie bajt. - Iterácia po ruinoch: ruina predstavuje Unicode code point. Go používa UTF-8, takže jedna ruina môže zaberieť od 1 do 4 bajtov.
- Získanie podreťazca: operácia rez
string[start:end]vytvára nový reťazec, ktorý ukazuje na ten istý úsek pamäti, ale s inými hranicami.
Príklady:
// Vyhlásenie a inicializácia
var s string
s = "Привет" // String literál v Go - sekvencia bajtov,
// zvyčajne interpretovaná ako UTF-8
// Dĺžka reťazca v bajtoch
byteLength := len(s) // 12, pretože "П", "р", "и", "в", "е", "т" sú viacbajtové znaky v UTF-8
// Iterácia po ruinoch
runeCount := 0
for index, runeValue := range s {
// index - index začiatku ruiny v bajtoch
// runeValue - hodnota ruiny (int32)
_ = index // Použitie zástupného `_` pre nepoužitú premennú
// fmt.Printf("Index: %d, Ruina: %c (U+%04X)\n", index, runeValue, runeValue)
runeCount++
}
// runeCount bude 6
// Iterácia po bajtoch
byteCount := 0
for i := 0; i < len(s); i++ {
// s[i] - bajt na indexe i
_ = s[i] // Použitie zástupného `_`
// fmt.Printf("Bajt na indexe %d: %d\n", i, s[i])
byteCount++
}
// byteCount bude 12
// Získanie podreťazca (rez bajtov)
// Dôležité: rez bajtov môže narušiť viacbajtovú ruinu
// sub := s[0:5] // Toto môže byť neplatná UTF-8 sekvencia
// Použitie balíkov strings alebo unicode/utf8 na bezpečnú prácu s ruinoch
Porovnanie so slice-om bajtov ([]byte):
| Charakteristika | String | []byte |
|---|---|---|
| Nemennosť | Nie | Áno |
| Predstavenie | Ukazovateľ + Dĺžka | Ukazovateľ + Dĺžka + Kapacita |
| Typ | Vložený primitívny | Slice (rez) |
| Použitie | Nemenný text | Menné údaje (bajty) |
Prevod medzi string a []byte:
// string -> []byte
byteSlice := []byte(s)
// []byte -> string
newString := string(byteSlice)