Le comportement particulier des tranches nulles dans les interfaces Go
Dans Go, les tranches peuvent se voir attribuer la valeur nulle, ce qui signifie une tranche vide. Cependant, lorsqu'une tranche nulle est passée comme argument à une fonction attendant une interface{}, une différence de comportement surprenante apparaît.
Considérez le terrain de jeu Go suivant :
<code class="go">package main import "fmt" func main() { var i []int = nil yes(i) // output: true no(i) // output: false } func yes(thing []int) { fmt.Println(thing == nil) } func no(thing interface{}) { fmt.Println(thing == nil) }</code>
Dans le Dans l'exemple ci-dessus, deux fonctions, oui et non, reçoivent la même tranche nulle comme argument. Cependant, le résultat des deux fonctions diffère. yes s'imprime vrai, indiquant que la tranche est effectivement nulle. non, par contre, imprime faux.
Pourquoi y a-t-il cet écart ? La réponse réside dans la façon dont les tranches nulles sont représentées en interne dans les interfaces Go.
Une variable interface{}, utilisée pour représenter un large éventail de types, se compose de deux champs : un type et un pointeur de données. Lorsqu'une tranche nulle est transmise à une fonction attendant une interface{}, elle est enveloppée dans un type interface{} et le pointeur de données est défini sur nil.
Dans le cas de oui, il compare directement le argument à zéro, demandant effectivement si la tranche elle-même est nulle. Cette comparaison renvoie vrai puisque la tranche est bien vide.
Cependant, la fonction no reçoit la tranche nulle enveloppée dans une interface{}. La comparaison dans ce cas ne se fait pas seulement entre la tranche et nil mais entre l'ensemble de l'interface {} et nil. Dans le runtime, cette comparaison se résume à tester si le pointeur de données de l'interface{} est nul, ce qui est faux car le wrapper de l'interface lui a alloué de la mémoire.
Ce comportement est également documenté dans la FAQ de Go :
"Un problème courant avec les tranches nulles passées aux interfaces : puisqu'une tranche nulle est représentée par une valeur d'interface nulle, écrire if i == nil peut faussement réussir lors du test de la valeur d'une interface i (une interface nulle est faux)."
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!