La valeur initiale nil
Dans la section précédente, nous avons mentionné que c'est un comportement erroné d'affecter un élément à une map nil
.
Prenons cette opportunité pour explorer le véritable sens de nil
en Go.
L'essence de nil
est un identifiant prédéfini.
Pour les types de données de base, leurs valeurs initiales sont différentes :
- Valeurs booléennes
- Valeurs numériques
- Chaînes de caractères
Cependant, pour les slices, les dictionnaires, les pointeurs, les canaux et les fonctions, leur valeur initiale est nil
. Ce n'est pas la valeur par défaut initiale avec laquelle nous sommes familiers.
Cela se reflète dans les objets instanciés qui sont affectés à nil
. Bien qu'ils puissent être imprimés, ils ne peuvent pas être utilisés.
De plus, il y a quelques points à noter concernant nil
.
Non-comparabilité des différents types de nil
package main
import "fmt"
func main() {
var m map[int]string
var p *int
fmt.Printf("%v", m == p)
}
La sortie du programme est la suivante :
invalid operation: m == p (mismatched types map[int]string and *int)
C'est-à-dire que nous ne pouvons pas comparer le nil
d'un pointeur de type int
avec le nil
d'une map.
Ils ne sont pas comparables.
nil
n'est pas un mot-clé
package main
import "fmt"
func main() {
var nilValue = "= =$"
fmt.Println(nilValue)
}
La sortie du programme est la suivante :
= =$
Nous pouvons définir une variable nommée nil
et elle peut être compilée sans erreur. Cependant, nous vous recommandons fortement de ne pas faire cela dans le développement réel.
Non-comparabilité de nil
package main
import "fmt"
func main() {
fmt.Println(nil == nil)
}
La sortie du programme est la suivante :
invalid operation: nil == nil (operator == not defined on nil)