Maison  >  Article  >  développement back-end  >  Pourquoi une tranche nulle transmise à une interface dans Go n'est-elle pas égale à zéro ?

Pourquoi une tranche nulle transmise à une interface dans Go n'est-elle pas égale à zéro ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-04 01:28:03220parcourir

Why Does a Nil Slice Passed to an Interface in Go Not Equal Nil?

Comprendre le paradoxe de la tranche nulle dans les interfaces Go

Lorsque vous passez une tranche nulle en tant qu'interface, pourquoi le résultat n'est-il pas nul ? Ce comportement déroutant peut s'expliquer par la compréhension de l'implémentation sous-jacente des interfaces Go.

Dans Go, une variable interface{} est essentiellement une structure à deux champs, composée d'un descripteur de type et d'une valeur de données, comme illustré par le Iface struct :

struct Iface {
    Itab*   tab;
    void*   data;
};

Maintenant, analysons les deux appels de fonction dans le code fourni :

<code class="go">yes([]int{}) // output: true
no([]int{})  // output: false</code>

oui Fonction :

Dans la fonction yes, la valeur []int{} est passée comme paramètre. Puisque yes n'accepte qu'un paramètre slice, le compilateur traite nil comme une tranche de valeur nulle. Ainsi, la comparaison thing == nil devient nil == nil, qui renvoie true.

no Function :

En revanche, la fonction no attend une interface{} paramètre. Lorsque vous transmettez la valeur []int{}, Go l'enveloppe automatiquement dans un type interface{}. le convertissant efficacement en interface{[]int, nil}. La comparaison thing == nil est maintenant évaluée comme interface{[]int, nil} == nil, ce qui donne false.

Ce comportement est clarifié davantage dans la FAQ Go, qui explique que « les interfaces contenant nil ne sont que égal à nul si tous leurs membres sont nuls" (c'est-à-dire dans le cas de cet exemple, []int (le membre de type) ne peut pas être nul).

Par conséquent, lorsqu'il s'agit de tranches nulles dans les interfaces, c'est Il est crucial d'être conscient de cette bizarrerie et de considérer l'implémentation sous-jacente pour interpréter correctement le comportement.

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