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 perint32. L'iterazione su una stringa usandorangedecodifica 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 usautf8.RuneCountInString(s)o si itera conrange. - Concatenazione: Per unire le stringhe si usa l'operatore
+. Questo crea una nuova stringa. Per una concatenazione efficiente di molte stringhe, si consiglia di usarestrings.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"