Vai al contenuto
eLearner.app
Modulo 1 · Lezione 2 di 52/50 nel corso~10 min
Lezioni del modulo (2/5)

Zero value e conversioni di tipo

In Go ogni variabile dichiarata senza un valore esplicito riceve uno zero value: il "valore neutro" del suo tipo. È una differenza enorme rispetto a JavaScript, dove let x; produce undefined, o C, dove ti ritrovi con memoria spazzatura. Niente undefined, niente UB: solo zero.

La tabella degli zero value

CategoriaTipoZero value
Numericiint, int64, float32, float64, uint, ...0
Booleanoboolfalse
Stringastring"" (stringa vuota)
Puntatore*Tnil
Slice / Map / Channel[]T, map[K]V, chan Tnil
Funzione / Interfacciafunc(...), interface{...}nil
StructT struct{...}tutti i campi al loro zero value
Go
var i int        // 0
var f float64    // 0
var s string     // ""
var b bool       // false
var p *int       // nil
var nums []int   // nil  (NB: una slice nil ha len 0 e si può iterare!)

Le conversioni sono SEMPRE esplicite

Diversamente da C, Python o JS, Go non promuove automaticamente un numerico a un altro: bisogna scrivere tipo(valore).

Go
i := 42
var f float64 = float64(i)
var u uint = uint(i)

Questo vale anche per tipi "compatibili" come int e int64: serve sempre la conversione esplicita.

Go
var a int = 10
var b int64 = int64(a)  // obbligatorio

Conversione tra numerici: attenzione alla troncatura

Passare da float64 a int tronca verso zero, non arrotonda:

Go
f := 3.9
i := int(f)   // 3, non 4
n := int(-3.9) // -3, non -4

Conversione stringa ↔ numeri

string(65) NON dà "65": dà "A" (il rune con code point 65). Per stringa → numero e viceversa serve il pacchetto strconv:

Go
import "strconv"

s := strconv.Itoa(42)        // "42"
n, err := strconv.Atoi("42") // 42, nil

Lo vedremo a fondo nel modulo Stdlib.

Prova tu

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

Dichiara una variabile counter di tipo int senza inizializzarla e stampala. Atteso: 0.

Caricamento editor…
Mostra suggerimento

Senza inizializzatore la variabile assume lo zero value del tipo.

Soluzione disponibile dopo 3 tentativi

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

Dato l'intero n=10, converti n in float64 e dividi per 4. Stampa il risultato (atteso 2.5).

Caricamento editor…
Mostra suggerimento

Senza la conversione esplicita, `n / 4` è una divisione intera che dà 2.

Soluzione disponibile dopo 3 tentativi

Quiz#go.m1.l2.e3
Pronto

Cosa stampa questo codice?

Go
f := 3.7
fmt.Println(int(f))
Opzioni di risposta

Recap

  • Ogni tipo ha uno zero value coerente: niente undefined, niente UB.
  • Slice/map/chan/func/interface/pointer hanno zero value nil.
  • Le conversioni numeriche sono sempre esplicite con tipo(valore).
  • int(float) tronca verso zero; per arrotondare usa math.Round.
  • Per stringa ↔ numero usa il pacchetto strconv (NON il cast diretto).