Maison >développement back-end >Golang >Voici quelques titres basés sur des questions qui capturent l'essence de votre article : * Comment définir une interface ou un pointeur sur Nil dans Golang ? * Assignation Golang Nil : interfaces vs pointeurs : quel est le

Voici quelques titres basés sur des questions qui capturent l'essence de votre article : * Comment définir une interface ou un pointeur sur Nil dans Golang ? * Assignation Golang Nil : interfaces vs pointeurs : quel est le

Linda Hamilton
Linda Hamiltonoriginal
2024-10-27 06:46:021109parcourir

Here are a few question-based titles that capture the essence of your article:

* How do I Set an Interface or Pointer to Nil in Golang? 
* Golang Nil Assignment: Interfaces vs. Pointers: What's the Difference?
* Zeroing Out in Golang: A Deep Dive into S

Comment définir une interface ou un pointeur sur Nil dans Golang

Dans Golang, définir une valeur d'interface sur zéro peut ne pas être aussi simple que prévu. Cet article explique comment définir les interfaces et les pointeurs sur zéro dans différents scénarios.

Définir une interface sur Nil

Lorsque vous traitez une valeur d'interface, en particulier une interface qui contient un type concret, l'approche correcte consiste à transmettre un pointeur vers l'interface plutôt que la valeur de l'interface elle-même. Pour définir une interface sur zéro, utilisez une fonction qui accepte un pointeur d'interface, telle que :

<code class="go">func setNilIf(v *interface{}) {
    *v = nil
}</code>

Exemple :

<code class="go">var i interface{} = "Bob"
setNilIf(&i)
fmt.Println(i) // Prints <nil></code>

Définition d'un pointeur sur Nil

Désactiver la valeur d'un pointeur nécessite un peu plus d'effort. Puisque les pointeurs sont essentiellement des adresses mémoire, nous devons déréférencer le pointeur pour réellement modifier la valeur. Cela introduit un problème car unsafe.Pointer ne peut pas être déréférencé directement. Pour résoudre ce problème, nous pouvons utiliser la fonction suivante :

<code class="go">func setNilPtr(p unsafe.Pointer) {
    *(**int)(p) = nil
}</code>

Exemple :

<code class="go">typ := &TYP{InternalState: "filled"}
fmt.Println(typ) // Prints &{filled}
setNilPtr(unsafe.Pointer(&typ))
fmt.Println(typ) // Prints <nil></code>

Remarque : Par souci de simplicité, l'exemple utilise int comme le type de cible pour le déréférencement. N'importe quel type de pointeur peut être utilisé comme cible.

Vous pouvez également utiliser la réflexion pour annuler un pointeur :

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

Exemple :

<code class="go">typ2 := &TYP{InternalState: "filled"}
fmt.Println(typ2) // Prints &{filled}
setNilPtr2(typ2)
fmt.Println(typ2) // Prints <nil></code>

Meilleure pratique

Bien que les techniques décrites ci-dessus fournissent des moyens de définir les interfaces et les pointeurs sur zéro, il est préférable d'utiliser l'approche idiomatique, qui consiste simplement à attribuer zéro à la valeur. Par exemple :

<code class="go">// Set interface to nil
i = nil

// Set pointer to nil
typ = nil</code>

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