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 stringiteruojant 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)