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 stringatgriež 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 | Nē | Jā |
| 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)