Maison > développement back-end > Golang > Comment définir une interface sur Nil dans Golang : quelle est la différence entre Nil, un pointeur et une interface ?

Comment définir une interface sur Nil dans Golang : quelle est la différence entre Nil, un pointeur et une interface ?

Susan Sarandon
Libérer: 2024-10-31 10:08:02
original
295 Les gens l'ont consulté

How to Set an Interface to Nil in Golang: What's the Difference Between Nil a Pointer and an Interface?

Définition d'une interface sur Nil dans Golang

Dans Golang, une valeur d'interface représente le comportement d'un objet, mais ce n'est pas l'objet lui-même. Lorsque vous tentez de supprimer une valeur interne d'une interface, vous avez en fait affaire à un pointeur vers un type concret, qui diffère d'une valeur d'interface.

Nil an Interface

Si vous disposez d'une interface dont vous souhaitez mettre la valeur à zéro, utilisez la fonction suivante :

<code class="go">func setNilIf(v *interface{}) {
    *v = nil
}</code>
Copier après la connexion

Exemple :

<code class="go">var i interface{} = "Bob"
fmt.Printf("Before: %v\n", i)
setNilIf(&i)
fmt.Printf("After: %v\n", i)</code>
Copier après la connexion

Sortie :

Before: Bob
After: <nil>
Copier après la connexion

Nil a Pointer

Dans votre cas, vous avez affaire à un pointeur vers un type concret. Pour annuler un pointeur, vous pouvez utiliser :

Utilisation d'unsafe.Pointer :

<code class="go">func setNilPtr(p unsafe.Pointer) {
    *(**int)(p) = nil
}</code>
Copier après la connexion

Exemple :

<code class="go">type TYP struct {
    InternalState string
}
typ := &TYP{InternalState: "filled"}
fmt.Printf("Before: %v\n", typ)
setNilPtr(unsafe.Pointer(&typ))
fmt.Printf("After: %v\n", typ)</code>
Copier après la connexion

Sortie :

Before: &{filled}
After: <nil>
Copier après la connexion
Copier après la connexion

Utilisation de Reflection :

<code class="go">func setNilPtr2(i interface{}) {
    v := reflect.ValueOf(i)
    v.Elem().Set(reflect.Zero(v.Elem().Type()))
}</code>
Copier après la connexion

Exemple :

<code class="go">typ2 := &TYP{InternalState: "filled"}
fmt.Printf("Before: %v\n", typ2)
setNilPtr2(&typ2)
fmt.Printf("After: %v\n", typ2)</code>
Copier après la connexion

Sortie :

Before: &{filled}
After: <nil>
Copier après la connexion
Copier après la connexion

Remarque :

Pour plus de simplicité, il est généralement recommandé d'attribuer directement nil à la variable pointeur, plutôt que d'utiliser des méthodes complexes comme celles ci-dessus.

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal