Le langage de programmation Go a la réputation d’être simple à apprendre. Cependant, il recèle quelques pièges qui peuvent être difficiles à détecter pour un novice. Cette série d’articles propose d’en désamorcer quelques uns.
Les assertions sur les types peuvent être parfois obscures:
package main
import "fmt"
func main() {
var data interface{} = "string"
if cast, ok := data.(int); ok {
fmt.Printf("%v is an int\n", cast)
} else {
fmt.Printf("%v is not an int\n", cast)
}
}
Si nous exécutons ce code, nous obtenons:
$ go run broken.go
0 is not an int
Pourquoi cela ? Comment corriger ce code ?
L’expression cast, ok := data.(int)
réalise une assertion de type. Ce qui implique que :
data
en int
cast
la valeur en int
et ok
vaut true
cast
la valeur nulle des int
et ok
vaut false
Par conséquent, comme data
n’est pas un entier, ok
vaut false
et on affecte 0 à cast
, donc on ne lui affecte pas la valeur chaîne de data
Nous pouvons corriger cela en réalisant un deuxième transtypage, comme suit :
package main
import "fmt"
func main() {
var data interface{} = "string"
if cast, ok := data.(int); ok {
fmt.Printf("%v is an int\n", cast)
} else {
str := data.(string)
fmt.Printf("%v is not an int\n", str)
}
}
Enjoy!