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
249 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!

source:php.cn
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