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