Définition d'une interface sur Nil dans Go
Dans Go, les interfaces fournissent un moyen de définir un ensemble de méthodes qu'un type doit implémenter. Ils permettent le polymorphisme, permettant de traiter uniformément différents types. Cependant, définir directement une interface sur zéro peut être délicat.
La question des valeurs de pointeur par rapport aux valeurs d'interface
Lorsque vous essayez de définir une interface sur zéro, le défi se produit parce que les interfaces ne contiennent pas de valeurs réelles mais pointent plutôt vers des valeurs de types concrets. Par conséquent, pour modifier la valeur d'une interface, vous devez lui passer un pointeur.
Solution 1 : Nil an Interface{} Value
Si vous souhaitez nil une valeur d'interface{}, une fonction comme celle-ci est requise :
<code class="go">func setNilIf(v *interface{}) { *v = nil }</code>
Pour l'utiliser :
<code class="go">var i interface{} = "Bob" fmt.Printf("Before: %v\n", i) setNilIf(&i) fmt.Printf("After: %v\n", i)</code>
Solution 2 : Nil a Pointer Using unsafe.Pointer
Pour les pointeurs, ce qui est souvent le cas lors de la définition d'interfaces sur zéro, vous pouvez utiliser unsafe.Pointer, qui vous permet de convertir n'importe quel pointeur en type **unsafe.Pointer et inversement. Cela fournit un moyen de déréférencer et d'attribuer nil au pointeur :
<code class="go">func setNilPtr(p unsafe.Pointer) { *(**int)(p) = nil }</code>
Pour l'utiliser :
<code class="go">typ := &TYP{InternalState: "filled"} fmt.Printf("Before: %v\n", typ) setNilPtr(unsafe.Pointer(&typ)) fmt.Printf("After: %v\n", typ)</code>
Solution 3 : Nil un pointeur utilisant la réflexion
Une approche alternative aux pointeurs de suppression implique l'utilisation de la réflexion :
<code class="go">func setNilPtr2(i interface{}) { v := reflect.ValueOf(i) v.Elem().Set(reflect.Zero(v.Elem().Type())) }</code>
Pour l'utiliser :
<code class="go">typ2 := &TYP{InternalState: "filled"} fmt.Printf("Before: %v\n", typ2) setNilPtr2(&typ2) fmt.Printf("After: %v\n", typ2)</code>
Recommandation de simplicité
Malgré les différentes solutions présentées, l'approche recommandée reste d'attribuer zéro directement à la valeur :
<code class="go">i = nil typ = nil</code>
Cette approche est simple et évite une complexité inutile.
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!