J'ai une fonction
func doStuff(inout *interface{}) {
...
}
le but de cette fonction est de pouvoir traiter un pointeur de n'importe quel type en entrée. Mais quand je veux l'appeler avec le pointeur d'une structure, j'ai une erreur.
type MyStruct struct {
f1 int
}
Lors de l'appel de doStuff
ms := MyStruct{1}
doStuff(&ms)
J'ai
test.go:38: cannot use &ms (type *MyStruct) as type **interface {} in argument to doStuff
Comment puis-je lancer &ms
pour être compatible avec *interface{}
?
Il n'y a pas de "pointeur vers une interface" (techniquement, vous pouvez en utiliser un, mais vous n'en avez généralement pas besoin).
Comme vu dans " quelle est la signification de l'interface {} dans golang? ", interface
est un conteneur avec deux mots de données:
Supprimez donc le pointeur et doStuff
fonctionnera très bien: les données d'interface seront &ms
, votre pointeur:
func doStuff(inout interface{}) {
...
}
Voir cet exemple :
ms := MyStruct{1}
doStuff(&ms)
fmt.Printf("Hello, playground: %v\n", ms)
Production:
Hello, playground: {1}
Comme newacct mentionne dans les commentaires :
Passer directement le pointeur à l'interface fonctionne car si
MyStruct
est conforme à un protocole, alors*MyStruct
est également conforme au protocole (puisque l'ensemble de méthodes d'un type est inclus dans l'ensemble de méthodes de son type de pointeur).Dans ce cas, l'interface est l'interface vide, elle accepte donc tous les types de toute façon, mais quand même.