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