Maison >développement back-end >Golang >Pourquoi une tranche nulle se comporte-t-elle différemment lorsqu'elle est transmise à une interface dans Go ?

Pourquoi une tranche nulle se comporte-t-elle différemment lorsqu'elle est transmise à une interface dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-03 05:32:02300parcourir

Why Does a Nil Slice Behave Differently When Passed to an Interface in Go?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn