Sobes.tech
Middle

Kā ir uzbūvētas virknes programmēšanas valodā Go?

sobes.tech AI

Atbilde no AI

Go virkne ir nemaināma secība baitu.

Galvenās īpašības:

  • Nemaināmība: pēc izveides virkne nevar tikt mainīta.
  • Attēlojums: tiek glabāta kā norādītājs un garums. Norādītājs norāda uz pirmo baitu atmiņā. Garums ir baitu skaits.
  • Kodēšana: Go virknēm nav iekļauta informācija par kodēšanu. Tās bieži tiek izmantotas UTF-8 glabāšanai, bet var saturēt jebkādus baitus.
  • Iterācija pa baitiem: cikls for index, value range string atgriež indeksu un rúnu (int32), nevis baitu.
  • Rúnas iterācija: runa ir Unicode koda punkts. Go izmanto UTF-8, tāpēc viena runa var aizņemt no 1 līdz 4 baitiem.
  • Apakšvirknes iegūšana: operācija string[start:end] izveido jaunu virkni, kas norāda uz to pašu atmiņas segmentu, bet ar citām robežām.

Piemēri:

// Deklarācija un inicializācija
var s string
s = "Привет" // Virknes literal vārds Go - baitu secība,
             // parasti interpretē kā UTF-8

// Virknes garums baitos
byteLength := len(s) // 12, jo "П", "р", "и", "в", "е", "т" ir daudzbaitu rakstzīmes

// Iterācija pa rúnām
runeCount := 0
for index, runeValue := range s {
    // index - rúnas sākuma baitā
    // runeValue - rúnas vērtība (int32)
    _ = index // izmanto `_` kā aizstājēju
    // fmt.Printf("Index: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
    runeCount++
}
// runeCount būs 6

// Iterācija pa baitiem
byteCount := 0
for i := 0; i < len(s); i++ {
    // s[i] - baitis indeksā i
    _ = s[i] // izmanto `_`
    // fmt.Printf("Byte at index %d: %d\n", i, s[i])
    byteCount++
}
// byteCount būs 12

// Apakšvirknes iegūšana (sagriešana baitos)
// Svarīgi: baitu sagriešana var pārtraukt daudzbaitu rúnu
// sub := s[0:5] // Tas var būt nederīgs UTF-8 secība

// Drošai darbībai ar rúnām izmanto `strings` vai `unicode/utf8` pakotnes

Salīdzinājums ar baitu sēriju ([]byte):

Īpašība String []byte
Maināmība
Attēlojums Norādītājs + Garums Norādītājs + Garums + Kapacitāte
Tips Iebūvēts primitīvs Sērija (slice)
Lietošana Nemaināms teksts Maināmi dati (baiti)

Konversija starp string un []byte:

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

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