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!