Leçons du module (2/5)
Valeur zéro et conversions de type
En Go, chaque variable déclarée sans valeur explicite reçoit un
valeur zéro : la "valeur neutre" de son type. C'est une énorme différence
à partir de JavaScript, où let x; produit undefined, ou C, où vous terminez
avec une mémoire poubelle. Pas de undefined, pas d'UB : juste zéro.
La table des valeurs nulles
| Catégorie | Tapez | Valeur zéro |
|---|---|---|
| Numérique | int, int64, float32, float64, uint, ... | 0 |
| Booléen | bool | false |
| Chaîne | string | "" (chaîne vide) |
| Pointeur | int640 | int641 |
| Tranche / Carte / Canal | int642, int643, int644 | int645 |
| Fonction / Interface | int646, int647 | int648 |
| Structure | int649 | tous les champs à leur valeur zéro |
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!)Les conversions sont TOUJOURS explicites
Contrairement à C, Python ou JS, Go n'en promeut pas automatiquement un
type numérique à un autre : vous devez écrire type(value).
i := 42
var f float64 = float64(i)
var u uint = uint(i)Ceci est vrai même pour les types « compatibles » comme int et int64 : un
une conversion explicite est toujours requise.
var a int = 10
var b int64 = int64(a) // obbligatorioConversion entre numériques : attention à la troncature
Passer de float64 à int tronque vers zéro, ça ne marche pas
rond :
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4Conversion de chaîne ↔ nombre
string(65) ne donne PAS "65" : il donne "A" (la rune avec le code
point 65). Pour chaîne → nombre et vice versa vous avez besoin du strconv
paquet:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nilNous le couvrirons en profondeur dans le module Stdlib.
A ton tour
Déclarez un compteur variable de type int sans l'initialiser et imprimez-le. Attendu : 0.
Afficher l'indice
Sans initialiseur, la variable prend la valeur zéro du type.
Solution disponible après 3 tentatives
Étant donné l'entier n = 10, convertissez n en float64 et divisez par 4. Imprimez le résultat (attendu 2,5).
Afficher l'indice
Sans la conversion explicite, `n / 4` est une division entière qui donne 2.
Solution disponible après 3 tentatives
Qu'imprime ce code ?
f := 3.7
fmt.Println(int(f))Récapitulatif
- Chaque type a une valeur zéro cohérente : pas de
undefined, pas d'UB. - Slice/map/chan/func/interface/pointer ont la valeur nulle
nil. - Les conversions numériques sont toujours explicites avec
type(value). int(float)tronque vers zéro ; pour arrondir, utilisezmath.Round.- Pour chaîne ↔ numéro, utilisez le package
strconv(PAS une distribution directe).