Vai al contenuto
eLearner.app
Modulo 8 · Lezione 2 di 537/50 nel corso~12 min
Lezioni del modulo (2/5)

`strings` e `strconv`

strings e strconv sono due pacchetti che userai costantemente. Il primo manipola stringhe (split, trim, replace, search); il secondo converte fra stringhe e tipi base (int, float, bool).

strings: le funzioni che ricorrono ogni giorno

Go
import "strings"

strings.ToUpper("ciao")              // "CIAO"
strings.ToLower("CIAO")              // "ciao"
strings.Contains("ciao mondo", "mo") // true
strings.HasPrefix("foo.txt", "foo")  // true
strings.HasSuffix("foo.txt", ".txt") // true
strings.Index("ciao", "a")           // 2 (o -1 se assente)
strings.Count("banana", "a")         // 3

strings.Split("a,b,c", ",")               // []string{"a","b","c"}
strings.SplitN("a,b,c,d", ",", 2)         // []string{"a","b,c,d"}
strings.Join([]string{"a","b"}, "-")     // "a-b"

strings.TrimSpace("  ciao\n")             // "ciao"
strings.Trim("__ciao__", "_")             // "ciao"
strings.ReplaceAll("aaa", "a", "b")       // "bbb"
strings.Replace("aaa", "a", "b", 2)       // "bba"  (limite 2)

Esistono anche varianti EqualFold per confronti case-insensitive senza allocare e Cut(s, sep) (before, after, found) per parsing in una riga.

Go
key, val, ok := strings.Cut("name=Ada", "=")
// "name", "Ada", true

strings.Builder per concatenare in loop

La concatenazione s = s + "x" in un loop alloca a ogni iterazione (le stringhe sono immutabili). Per testi costruiti in più passi usa strings.Builder:

Go
var b strings.Builder
for i := 0; i < 1000; i++ {
    b.WriteString("x")
}
out := b.String()

Allocazione ammortizzata, nessuna copia inutile.

strconv: conversioni stringa ↔ numero / bool

Go
import "strconv"

n, err := strconv.Atoi("42")     // int   da decimale
s := strconv.Itoa(42)             // "42"
b, err := strconv.ParseBool("true")

// Versioni generiche con base ed eventualmente bit-size
i64, err := strconv.ParseInt("ff", 16, 64) // 255
u64, err := strconv.ParseUint("7", 10, 8)  // 7
f, err := strconv.ParseFloat("3.14", 64)   // 3.14

// Numero → stringa
strconv.FormatInt(255, 16)                  // "ff"
strconv.FormatFloat(3.14, 'f', 2, 64)       // "3.14"
strconv.FormatBool(true)                    // "true"

Atoi/Itoa sono scorciatoie ergonomiche; per controllo fine su base e dimensione usa ParseInt/FormatInt.

Gestione degli errori di parsing

Atoi ritorna (int, error). L'errore è quasi sempre *strconv.NumError, e puoi confrontarlo via errors.Is con le sentinelle strconv.ErrSyntax o strconv.ErrRange:

Go
n, err := strconv.Atoi(input)
switch {
case errors.Is(err, strconv.ErrSyntax):
    return fmt.Errorf("input non numerico: %q", input)
case errors.Is(err, strconv.ErrRange):
    return fmt.Errorf("numero fuori range: %q", input)
case err != nil:
    return err
}
_ = n

Esercizi

Esercizio#go.m8.l2.e1
Tentativi: 0Caricamento…

Splitta la stringa 'a,b,c' sulla virgola e stampa lo slice risultante.

Caricamento editor…

Soluzione disponibile dopo 3 tentativi

Esercizio#go.m8.l2.e2
Tentativi: 0Caricamento…

Converti la stringa '42' in int con strconv.Atoi, gestisci l'errore e stampa il numero.

Caricamento editor…

Soluzione disponibile dopo 3 tentativi

Quiz#go.m8.l2.e3
Pronto

Qual è il modo idiomatico per convertire l'intero 42 nella stringa "42"?

Go
s := ???(42)
// vogliamo s == "42"
Opzioni di risposta