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>
Exemple :
<code class="go">var i interface{} = "Bob" fmt.Printf("Before: %v\n", i) setNilIf(&i) fmt.Printf("After: %v\n", i)</code>
Sortie :
Before: Bob After: <nil>
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>
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>
Sortie :
Before: &{filled} After: <nil>
Utilisation de Reflection :
<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.Printf("Before: %v\n", typ2) setNilPtr2(&typ2) fmt.Printf("After: %v\n", typ2)</code>
Sortie :
Before: &{filled} After: <nil>
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!