Middle
Kuidas on stringid üles ehitatud programmeerimiskeeles Go?
sobes.tech AI
Vastus AI-lt
Go string on muutumatu baitide jada.
Peamised omadused:
- Muutumatuse: pärast loomist ei saa stringi muuta.
- Esitus: salvestatakse näitaja ja pikkusena. Näitaja osutab mälus esimesele baitile. Pikkus on baitide arv.
- Koodimine: Go stringid ei sisalda teavet koodimise kohta. Neid kasutatakse sageli UTF-8 salvestamiseks, kuid võivad sisaldada mis tahes baitte.
- Iteratsioon baitide üle: tsükkel
for index, value range stringtagastab indeks ja ründe (int32), mitte bait. - Ründade iteratsioon: rüün on Unicode koodipunkt. Go kasutab UTF-8, seega võib üks rüün võtta 1 kuni 4 baiti.
- Alamtüki saamine: operatsioon
string[start:end]loob uue stringi, mis viitab samale mälusegmendile, kuid erinevate piirangutega.
Näited:
// Deklaratsioon ja initsialiseerimine
var s string
s = "Привет" // String literal Go-s - baitide jada,
// tavaliselt tõlgendatakse UTF-8-ks
// Stringi pikkus baitides
byteLength := len(s) // 12, kuna "П", "р", "и", "в", "е", "т" on mitme baitiga märgid
// Iteratsioon rüünade üle
runeCount := 0
for index, runeValue := range s {
// index - rüün alguse bait
// runeValue - rüün väärtus (int32)
_ = index // kasutame `_` asendusena
// fmt.Printf("Index: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
runeCount++
}
// runeCount on 6
// Baitide üle iteratsioon
byteCount := 0
for i := 0; i < len(s); i++ {
// s[i] - bait indeksil i
_ = s[i] // kasutame `_`
// fmt.Printf("Byte at index %d: %d\n", i, s[i])
byteCount++
}
// byteCount on 12
// Alamstringi saamine (lõik baitidest)
// Oluline: baitide lõikamine võib katkestada mitme baitiga rüün
// sub := s[0:5] // See võib olla kehtetu UTF-8 järjestus
// Kasutades pakette `strings` või `unicode/utf8` turvaliseks töötamiseks rüünadega
Võrdlus baitide lõiguga ([]byte):
| Omadus | String | []byte |
|---|---|---|
| Muutuvus | Ei | Jah |
| Esitus | Näitaja + Pikkus | Näitaja + Pikkus + Mahutavus |
| Tüüp | Sisseehitatud primitiivne | Lõik (slice) |
| Kasutamine | Muutumatu tekst | Muutuvad andmed (baits) |
Konversioon string ja []byte vahel:
// string -> []byte
byteSlice := []byte(s)
// []byte -> string
newString := string(byteSlice)