Sobes.tech
Junior

Come funzionano le stringhe nel linguaggio Go?

sobes.tech AI

Risposta dell'AI

Le stringhe in Go sono sequenze immutabili di byte. Rappresentano un "taglio di byte" ([]byte) con garanzia di immutabilità.

Caratteristiche principali:

  • Immutabilità: Dopo la creazione, una stringa non può essere modificata. Qualsiasi operazione che sembri modificarla, in realtà crea una nuova stringa.
  • Rappresentazione: Per impostazione predefinita, le stringhe in Go rappresentano testo codificato in UTF-8. Tuttavia, sono semplicemente sequenze di byte; l'interpretazione come UTF-8 avviene durante l'elaborazione con le rune.
  • Rune: I caratteri Unicode in Go sono rappresentati dal tipo rune, che è un alias per int32. L'iterazione su una stringa usando range decodifica automaticamente UTF-8 e fornisce le rune e i loro indici iniziali in byte.
  • Lunghezza: La funzione len(s) restituisce il numero di byte nella stringa, non il numero di caratteri (rune). Per ottenere il numero di rune, si usa utf8.RuneCountInString(s) o si itera con range.
  • Concatenazione: Per unire le stringhe si usa l'operatore +. Questo crea una nuova stringa. Per una concatenazione efficiente di molte stringhe, si consiglia di usare strings.Builder.

Esempi:

// Dichiarazione di una stringa
str := "Hello, 世界"

// Lunghezza della stringa (in byte)
byteLen := len(str) // 13 (H(1) e(1) l(1) l(1) o(1) ,(1)  (1) 世(3) 界(3))

// Iterazione sulle rune
runeCount := 0
for index, runeValue := range str {
	// index - indice iniziale della rune in byte
	// runeValue - la rune
	runeCount++
	// fmt.Printf("Indice: %d, Runa: %c (Valore: %d)\n", index, runeValue, runeValue)
}
// runeCount - numero di rune (9)

// Accesso a un byte tramite indice
// Attenzione: è un byte, non un carattere!
// byteAtIndex := str[0] // 'H'
// byteAtIndex := str[7] // Byte iniziale del carattere '世'

// Concatenazione di stringhe
newStr := str + "!"

// Uso di strings.Builder per una concatenazione efficiente
// import "strings"
var builder strings.Builder
builder.WriteString("Hello, ")
builder.WriteString("World")
efficientStr := builder.String() // "Hello, World"