Sobes.tech
Junior

Cum funcționează șirurile în limbajul Go?

sobes.tech AI

Răspuns de la AI

Șirurile în Go sunt secvențe imuabile de octeți. Ele reprezintă o "tăietură de octeți" ([]byte) cu garanția imuabilității.

Caracteristici cheie:

  • Imuabilitate: După crearea, un șir nu poate fi modificat. Orice operație care pare să îl modifice, de fapt, creează un șir nou.
  • Reprezentare: În mod implicit, șirurile în Go reprezintă text codificat în UTF-8. Cu toate acestea, ele sunt pur și simplu secvențe de octeți; interpretarea ca UTF-8 are loc atunci când se lucrează cu rune.
  • Runes: Caracterele Unicode în Go sunt reprezentate de tipul rune, care este un alias pentru int32. Iterarea peste un șir folosind range decodează automat UTF-8 și furnizează rune și indicii lor inițiali în octeți.
  • Lungime: Funcția len(s) returnează numărul de octeți din șir, nu numărul de caractere (rune). Pentru a obține numărul de rune, se folosește utf8.RuneCountInString(s) sau se iterează cu range.
  • Concatenare: Pentru unirea șirurilor, se folosește operatorul +. Acest lucru creează un șir nou. Pentru o concatenare eficientă a multor șiruri, se recomandă utilizarea strings.Builder.

Exemple:

// Declararea unui șir
str := "Hello, 世界"

// Lungimea șirului (în octeți)
byteLen := len(str) // 13 (H(1) e(1) l(1) l(1) o(1) ,(1)  (1) 世(3) 界(3))

// Iterarea peste rune
runeCount := 0
for index, runeValue := range str {
	// index - indicele inițial al rune în octeți
	// runeValue - rune
	runeCount++
	// fmt.Printf("Indice: %d, Runa: %c (Valoare: %d)\n", index, runeValue, runeValue)
}
// runeCount - numărul de rune (9)

// Accesul la un octet după index
// Atenție: acesta este un octet, nu un caracter!
// byteAtIndex := str[0] // 'H'
// byteAtIndex := str[7] // Octetul inițial al caracterului '世'

// Concatenarea șirurilor
newStr := str + "!"

// Utilizarea strings.Builder pentru concatenare eficientă
// import "strings"
var builder strings.Builder
builder.WriteString("Hello, ")
builder.WriteString("World")
efficientStr := builder.String() // "Hello, World"