Maison >développement back-end >Golang >Pourquoi la comparaison d'une tranche nulle à « nil » diffère-t-elle entre les types de béton et les interfaces dans Go ?

Pourquoi la comparaison d'une tranche nulle à « nil » diffère-t-elle entre les types de béton et les interfaces dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-03 08:45:03371parcourir

Why Does Comparing a Nil Slice to `nil` Differ Between Concrete Types and Interfaces in Go?

Type d'interface et tranches nulles

Dans Go, lors du passage d'une variable à une fonction qui attend un type d'interface, le comportement peut différer en fonction si la variable est une tranche ou non.

Considérez l'extrait 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 ce programme, la fonction yes attend une tranche d'entiers, tandis que la fonction no attend une interface taper. Lorsque nous appelons yes avec la tranche nulle i, la sortie est vraie car la tranche elle-même est nulle. Cependant, appeler no avec la tranche nil donne false.

Pour comprendre pourquoi cela se produit, nous devons nous plonger dans l'implémentation des interfaces dans Go. En interne, un type d'interface est représenté comme une structure contenant deux champs : Itab, qui fait référence au descripteur de type, et Data, qui contient la valeur réelle.

Lorsque vous passez une tranche nulle à oui, seule la valeur nulle est transmis en tant que données et la comparaison devient effectivement nil == nil, ce qui est vrai. Cependant, lors du passage d'une tranche nulle à no, Go l'enveloppe automatiquement dans un type d'interface, ce qui donne quelque chose comme no(interface{[]int, nil}). Dans ce cas, la comparaison devient interface{[]int, nil} == nil, qui renvoie false car le type d'interface lui-même n'est pas nul, même si les données sous-jacentes sont nulles.

Ce comportement peut être attribué à la nature des interfaces et à la manière dont elles interagissent avec des valeurs nulles. Comme l'explique la FAQ Go, les interfaces nulles et les valeurs concrètes nulles sont des concepts distincts. Lorsqu'un type d'interface contient une valeur nulle, cela ne signifie pas que l'interface elle-même est nulle. Par conséquent, comparer un type d’interface contenant une valeur nulle à zéro donnera 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