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!