Menu

Stringhe in Golang: Split, Join, Contains, Replace e altro

Lavorare con le stringhe in Go: il pacchetto strings (Split, Join, Contains, Replace, Fields, TrimSpace, ToUpper), costruire stringhe in modo efficiente con strings.Builder, stringhe raw su più righe, immutabilità e perché len conta i byte.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Una stringa Go è una sequenza immutabile di byte, di solito testo UTF-8. Gli operatori lavorano sulla stringa stessa (+, ==, <, indicizzazione, slicing), e tutto il resto sta nel pacchetto standard strings.

Dividere le stringhe

FunzioneDivide suNote
Split(s, sep)ogni sepmantiene le parti vuote; Split("", ",") restituisce [""], una stringa vuota
SplitN(s, sep, n)al massimo n partil'ultima parte contiene il resto
SplitAfter(s, sep)ogni seplascia il separatore su ogni parte
Fields(s)sequenze di spazi bianchinon restituisce mai parti vuote
FieldsFunc(s, f)caratteri per cui f è veraseparatori personalizzati
Cut(s, sep)solo il primo seprestituisce prima, dopo, trovato (Go 1.18)

Il caso Split("", ",") inganna molti: un input vuoto dà uno slice di lunghezza 1, non 0. Quando dividi l'input dell'utente, Fields oppure un controllo preventivo di s == "" evita un elemento vuoto fantasma.

strings.Cut è il modo più pulito per dividere coppie come key=value, user@host e simili. Go 1.24 ha aggiunto anche versioni con iteratori, strings.SplitSeq e strings.FieldsSeq, che producono le parti una alla volta senza costruire uno slice.

Cercare

FunzioneRestituisce
Contains(s, sub)true se sub compare in s
ContainsAny(s, chars)true se compare uno qualsiasi dei caratteri di chars
HasPrefix(s, p) / HasSuffix(s, p)true se s inizia o finisce con p
Index(s, sub)posizione in byte della prima corrispondenza, oppure -1
LastIndex(s, sub)posizione in byte dell'ultima corrispondenza, oppure -1
Count(s, sub)numero di corrispondenze non sovrapposte
EqualFold(a, b)uguaglianza senza distinzione tra maiuscole e minuscole

Tutte le ricerche distinguono tra maiuscole e minuscole tranne EqualFold. Per cercare senza questa distinzione, porta in minuscolo entrambi i lati oppure usa EqualFold per confrontare stringhe intere.

Trasformare

Una trappola: Trim, TrimLeft e TrimRight accettano un insieme di caratteri, non un prefisso. strings.TrimLeft("abcab", "ab") rimuove ogni a e b iniziale e restituisce "cab". Per rimuovere un prefisso o un suffisso esatto usa TrimPrefix e TrimSuffix.

Concatenazione e strings.Builder

+ unisce le stringhe, e fmt.Sprintf formatta dei valori in una stringa. Entrambi allocano ogni volta una nuova stringa, perché le stringhe sono immutabili. Va bene per poche operazioni ed è lento in un ciclo, dove ogni += copia tutto ciò che hai costruito fino a quel momento. Usa invece strings.Builder:

Uno strings.Builder al valore zero è pronto all'uso. Implementa io.Writer, quindi fmt.Fprintf ci scrive direttamente. Chiama prima b.Grow(n) se sai più o meno quanto sarà grande il risultato. Non copiare un Builder dopo averci scritto; passa un puntatore.

Stringhe su più righe e stringhe raw

Go ha due tipi di letterale stringa:

Le stringhe tra doppi apici interpretano le sequenze di escape (\n, \t, \", \\, \u00e9) e devono stare su una riga. Le stringhe raw tra backtick prendono tutto alla lettera, compresi i ritorni a capo, e sono quindi il modo per scrivere stringhe su più righe, espressioni regolari, JSON e percorsi Windows. Una stringa raw non può contenere un backtick, e i ritorni carrello al suo interno vengono eliminati. Nota che la query qui sopra inizia con un ritorno a capo, perché il letterale comincia subito dopo il backtick di apertura.

Lunghezza, indicizzazione e sottostringhe

len(s) è il numero di byte. s[i] è un byte, e s[i:j] è una sottostringa per posizioni in byte:

ï ed é occupano due byte ciascuno, quindi la stringa è lunga 12 byte e 10 caratteri. Tagliare per byte è sicuro finché le posizioni arrivano da strings.Index o simili, che restituiscono offset in byte sui confini dei caratteri. Per prendere "i primi n caratteri", converti prima in []rune. La pagina su rune e byte spiega UTF-8 in dettaglio.

Le stringhe sono immutabili

Non puoi cambiare un byte sul posto: s[0] = 'H' è un errore di compilazione (cannot assign to s[0] (neither addressable nor a map index expression)). Ogni funzione di strings restituisce una nuova stringa. Per modificarla, converti in []byte o []rune, cambia lo slice e riconverti:

b := []byte("hello")
b[0] = 'H'
s := string(b) // "Hello"

L'immutabilità è anche il motivo per cui le sottostringhe costano poco: s[2:5] condivide la memoria con s invece di copiarla. Il rovescio della medaglia è che una piccola sottostringa di una stringa enorme tiene in vita tutta la stringa enorme. Usa strings.Clone (Go 1.20) quando conservi un pezzo breve di un input grande.

Confrontare le stringhe

== e != confrontano il contenuto, e <, > confrontano byte per byte, cioè in ordine alfabetico per l'ASCII. strings.Compare esiste ma serve raramente; slices.Sort su un []string usa <. Per un ordinamento che rispetti le regole locali dei testi non inglesi, usa golang.org/x/text/collate.

Convertire altri tipi

I numeri diventano stringhe con strconv.Itoa, strconv.FormatFloat o fmt.Sprintf, e le stringhe diventano numeri con strconv.Atoi e strconv.ParseFloat. Non scrivere string(42): produce il carattere con code point 42, cioè "*". La pagina sulla conversione di tipo ha la tabella completa.

Domande frequenti

Come divido una stringa in Go?

Usa strings.Split(s, sep): strings.Split("a,b,c", ",") restituisce ["a" "b" "c"]. Per dividere su qualsiasi sequenza di spazi bianchi scartando le parti vuote, usa strings.Fields(s). strings.SplitN limita il numero di parti, e strings.Cut divide una sola volta attorno al primo separatore.

Come scrivo una stringa su più righe in Go?

Usa un letterale stringa raw tra backtick:

query := `SELECT id, name
FROM users
WHERE active = true`

Tutto ciò che sta tra i backtick viene preso alla lettera, compresi ritorni a capo e backslash. Una stringa raw non può contenere un backtick.

Come verifico se una stringa contiene una sottostringa in Go?

strings.Contains(s, substr) restituisce un bool. Funzioni collegate: strings.HasPrefix, strings.HasSuffix, strings.Index (posizione oppure -1), strings.ContainsAny (uno qualsiasi di un insieme di caratteri) e strings.EqualFold per l'uguaglianza senza distinzione tra maiuscole e minuscole.

Qual è il modo più veloce per concatenare stringhe in Go?

Per poche stringhe + va bene. Quando costruisci una stringa in un ciclo, usa strings.Builder: chiama WriteString più volte e String() una sola volta alla fine. Un += ripetuto in un ciclo copia ogni volta l'intera stringa, quindi rallenta man mano che la stringa cresce. Per unire uno slice con un separatore, usa strings.Join.

Perché len restituisce la lunghezza sbagliata per la mia stringa?

len(s) restituisce il numero di byte, non di caratteri. Le stringhe Go sono UTF-8, dove i caratteri fuori dall'ASCII occupano da 2 a 4 byte, quindi len("héllo") vale 6. Usa utf8.RuneCountInString(s) per il numero di code point Unicode.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA