web-dev-qa-db-fra.com

Cast un pointeur struct vers un pointeur d'interface dans Golang

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{}?

25
taharqa

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:

  • un mot est utilisé pour pointer vers une table de méthodes pour le type sous-jacent de la valeur,
  • et l'autre mot est utilisé pour pointer vers les données réelles détenues par cette valeur.

interface

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.

51
VonC