Sobes.tech
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 string tagastab 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)