Middle
Cum sunt structurate șirurile în limbajul de programare Go?
sobes.tech AI
Răspuns de la AI
Un șir în Go este o secvență imuabilă de octeți.
Caracteristici cheie:
- Imuabilitate: după crearea sa, șirul nu poate fi modificat.
- Reprezentare: este stocat ca un pointer și o lungime. Pointerul indică către primul octet al secvenței în memorie. Lungimea este numărul de octeți.
- Codificare: șirurile în Go nu conțin informații despre codificare. Sunt adesea folosite pentru stocarea UTF-8, dar pot conține orice octet.
- Iterare pe octeți: ciclul
for index, value range stringla iterarea peste un șir returnează indexul și rune-ul (int32), nu octetul. - Iterare pe rune-uri: un rune reprezintă un punct de cod Unicode. Go folosește UTF-8, deci un rune poate ocupa între 1 și 4 octeți.
- Obținerea unui subșir: operația de tăiere
string[start:end]creează un nou șir care indică aceeași zonă de memorie, dar cu limite diferite.
Exemple:
// Declarare și inițializare
var s string
s = "Привет" // Literal de șir în Go - secvență de octeți,
// de obicei interpretată ca UTF-8
// Lungimea șirului în octeți
byteLength := len(s) // 12, deoarece "П", "р", "и", "в", "е", "т" sunt caractere multibyte în UTF-8
// Iterare pe rune-uri
runeCount := 0
for index, runeValue := range s {
// index - indexul de început al rune-ului în octeți
// runeValue - valoarea rune-ului (int32)
_ = index // utilizarea unui identificator anonim _ pentru variabile neutilizate
// fmt.Printf("Index: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
runeCount++
}
// runeCount va fi 6
// Iterare pe octeți
byteCount := 0
for i := 0; i < len(s); i++ {
// s[i] - octet la indexul i
_ = s[i] // utilizarea unui identificator anonim
// fmt.Printf("Octet la indexul %d: %d\n", i, s[i])
byteCount++
}
// byteCount va fi 12
// Obținerea unui subșir (tăiere de octeți)
// Important: tăierea de octeți poate rupe un rune multibyte
// sub := s[0:5] // Poate fi o secvență UTF-8 invalidă
// Utilizarea pachetelor strings sau unicode/utf8 pentru lucru sigur cu rune
Comparativ cu tăierea de octeți ([]byte):
| Caracteristică | String | []byte |
|---|---|---|
| Modificabilitate | Nu | Da |
| Reprezentare | Poințer + Lungime | Poințer + Lungime + Capacitate |
| Tip | Primitiv încorporat | Slice (felie) |
| Utilizare | Text imuabil | Date modificabile (octeți) |
Conversie între string și []byte:
// string -> []byte
byteSlice := []byte(s)
// []byte -> string
newString := string(byteSlice)