Quali sono le sfumature nell'iterare su una stringa in Go?
sobes.tech AI
Risposta dell'AI
Durante l'iterazione su una stringa in Go, è importante ricordare che la stringa rappresenta una sequenza di byte, non di caratteri Unicode. Il pacchetto unicode/utf8 fornisce funzioni per lavorare con sequenze UTF-8 multibyte.
Punti principali:
-
Iterazione sui byte: Il ciclo
for i := 0; i < len(s); i++itera sui singoli byte. Se la stringa contiene caratteri multibyte, un carattere può essere rappresentato da più byte.// Esempio di iterazione sui byte str := "Привет" for i := 0; i < len(str); i++ { println(str[i]) // stampa i byte, non i caratteri } -
Iterazione sulle rune (punti di codice Unicode): Per lavorare correttamente con i caratteri Unicode, si dovrebbe usare il ciclo
for index, ru := range s. Questo itera sulle rune (punti di codice Unicode), gestendo sequenze UTF-8 multibyte.// Esempio di iterazione sulle rune str := "Привет" for index, ru := range str { println(index, ru) // stampa l'indice di inizio della rune e la rune stessa (come int32) } -
Lunghezza della stringa: La funzione
len(s)restituisce il numero di byte, non di rune. Per ottenere il numero di rune, usautf8.RuneCountInString(s).// Esempio di conteggio di byte e rune str := "Привет" println("Lunghezza in byte:", len(str)) // mostra il numero di byte println("Lunghezza in rune:", utf8.RuneCountInString(str)) // mostra il numero di rune -
Accesso tramite indice: L'accesso
s[i]restituisce il i-esimo byte, non la rune. L'accesso diretto alle rune tramite indice non è previsto.// Esempio di accesso a un byte str := "Привет" println(str[0]) // stampa il primo byte della stringa, non la prima rune -
Slicing di stringhe: Gli slice di stringhe funzionano anche a livello di byte.
s[i:j]crea un nuovo slice di byte.// Esempio di slicing di stringa sui byte str := "Привет" println(str[0:2]) // può mostrare una sequenza incorretta se i primi due byte non formano una rune completa
Per lavorare in modo affidabile con Unicode in Go, si consiglia di usare l'iterazione sulle rune (range) e le funzioni del pacchetto unicode/utf8.