Sobes.tech
Middle

Kaip struktūruotos eilutės programavimo kalboje Go?

sobes.tech AI

Atsakymas iš AI

Go eilutė yra nekintanti baitų seka.

Pagrindinės savybės:

  • Nekintamumas: sukūrus, eilutės pakeisti nebegalima.
  • Atvaizdavimas: saugoma kaip rodyklė ir ilgis. Rodyklė nurodo į pirmąją sekos baitą atmintyje. Ilgis yra baitų skaičius.
  • Kodavimas: Go eilutės nesuteikia informacijos apie kodavimą. Dažnai naudojamos UTF-8 saugojimui, bet gali turėti bet kokius baitus.
  • Iteracija per baitus: ciklas for index, value range string iteruojant grąžina indeksą ir rune (int32), o ne baitą.
  • Rune iteracija: rune yra Unicode kodo taškas. Go naudoja UTF-8, todėl viena rune gali užimti nuo 1 iki 4 baitų.
  • Subeilutės gavimas: operacija string[start:end] sukuria naują eilutę, nurodančią tą patį atminties segmentą, bet su kitomis ribomis.

Pavyzdžiai:

// Deklaravimas ir inicializavimas
var s string
s = "Привет" // eilutės literalas Go - baitų seka,
             // dažnai interpretuojama kaip UTF-8

// eilutės ilgis baitais
byteLength := len(s) // 12, nes "П", "р", "и", "в", "е", "т" yra daugia baitės simboliai

// iteracija per rune
runeCount := 0
for index, runeValue := range s {
    // index - rune pradžios baitas
    // runeValue - rune reikšmė (int32)
    _ = index // naudojame `_` kaip vietos žymeklį
    // fmt.Printf("Index: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
    runeCount++
}
// runeCount bus 6

// iteracija per baitus
byteCount := 0
for i := 0; i < len(s); i++ {
    // s[i] - baitas indeksu i
    _ = s[i] // naudojame `_`
    // fmt.Printf("Byte at index %d: %d\n", i, s[i])
    byteCount++
}
// byteCount bus 12

// subeilutės gavimas (pjaustymas baitais)
// Svarbu: baitų pjovimas gali sugadinti daugia baitę rune
// sub := s[0:5] // Tai gali būti netinkama UTF-8 seka

// Naudojant `strings` arba `unicode/utf8` paketus saugiam darbui su rune

Palyginimas su baitų srautu ([]byte):

Savybė String []byte
Keičiamumas Ne Taip
Atvaizdavimas Rodyklė + Ilgis Rodyklė + Ilgis + Talpa
Tipas Įmontuotas primityvas Srautas (slice)
Naudojimas Nekintamas tekstas Keičiamų duomenų (baitai)

Konversija tarp string ir []byte:

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

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