Sobes.tech
Middle

Hogyan épülnek fel a szövegek a Go programozási nyelvben?

sobes.tech MI

Válasz az MI-től

A Go-ban a string egy változatlan bájtokból álló sorozat.

Fő jellemzők:

  • Változatlanság: a létrehozás után a string nem módosítható.
  • Ábrázolás: mutatóként és hosszúságként tárolódik. A mutató a memória első bájtjára mutat. A hosszúság a bájtok száma.
  • Kódolás: a Go-ban a stringek nem tartalmaznak kódolási információt. Gyakran UTF-8 tárolására használják, de bármilyen bájtot tartalmazhatnak.
  • Iterálás bájtok szerint: a for index, value range string ciklus a stringen való iterálás során az indexet és a rune-t (int32) adja vissza, nem a bájtot.
  • Rune-okon való iterálás: egy rune egy Unicode kódpontot reprezentál. A Go UTF-8-et használ, így egy rune 1-től 4 bájt között lehet.
  • Részstring lekérése: a string[start:end] szeletelés új stringet hoz létre, amely ugyanarra a memória területre mutat, de más határokkal.

Példák:

// Deklarálás és inicializálás
var s string
s = "Привет" // String literál Go-ban - bájtok sorozata,
             // általában UTF-8-ként értelmezve

// A string hossza bájtokban
byteLength := len(s) // 12, mivel "П", "р", "и", "в", "е", "т" több bájtos karakterek UTF-8-ben

// Iterálás rune-okon
runeCount := 0
for index, runeValue := range s {
    // index - a rune kezdő indexe bájtokban
    // runeValue - a rune értéke (int32)
    _ = index // névtelen változó _ használata, ha nem használjuk
    // fmt.Printf("Index: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
    runeCount++
}
// runeCount 6 lesz

// Iterálás bájtokon
byteCount := 0
for i := 0; i < len(s); i++ {
    // s[i] - bájt az i-edik indexen
    _ = s[i] // névtelen változó _ használata
    // fmt.Printf("Bájt az index %d-nél: %d\n", i, s[i])
    byteCount++
}
// byteCount 12 lesz

// Részstring (slice bájtok)
// Fontos: a slice bájtok megszakíthatja a több bájtos rune-t
// sub := s[0:5] // Ez érvénytelen UTF-8 szekvencia lehet

// A biztonságos munkához használja a strings vagy unicode/utf8 csomagokat

Összehasonlítás a slice bájtokkal ([]byte):

Jellemző String []byte
Módosíthatóság Nem Igen
Ábrázolás Mutató + Hosszúság Mutató + Hosszúság + Kapacitás
Típus Beépített primitív Slice (szelet)
Használat Változatlan szöveg Módosítható adatok (bájtok)

Átalakítás string és []byte között:

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

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