web-dev-qa-db-fra.com

Pourquoi ne puis-je pas assigner un * Struct à une * Interface?

Je travaille juste à travers le Go tour , et je suis confus au sujet des pointeurs et des interfaces. Pourquoi ce code Go n'est-il pas compilé?

package main

type Interface interface {}

type Struct struct {}

func main() {
    var ps *Struct
    var pi *Interface
    pi = ps

    _, _ = pi, ps
}

c'est-à-dire si Struct est une Interface, pourquoi un *Struct ne serait-il pas un *Interface?

Le message d'erreur que je reçois est le suivant:

prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment:
        *Interface is pointer to interface, not interface
126
Simon Nickerson

Lorsque vous avez une structure implémentant une interface, un pointeur sur cette structure implémente automatiquement cette interface également. C'est pourquoi vous n'avez jamais *SomeInterface dans le prototype de fonctions, car cela n'ajoute rien à SomeInterface et vous n'avez pas besoin d'un tel type dans la déclaration de variable (voir cette question connexe ).

Une valeur d'interface n'est pas la valeur de la structure concrète (car elle a une taille variable, cela ne serait pas possible), mais c'est une sorte de pointeur (pour être plus précis, un pointeur sur la structure et un type ). Russ Cox le décrit exactement ici :

Les valeurs d'interface sont représentées sous la forme d'une paire de deux mots donnant un pointeur des informations sur le type stocké dans l'interface et un pointeur sur les données associées.

enter image description here

C'est pourquoi Interface, et non *Interface est le type correct pour contenir un pointeur sur une structure implémentant Interface.

Donc, vous devez simplement utiliser

var pi Interface
168
Denys Séguret

C'est peut-être ce que vous vouliez dire:

package main

type Interface interface{}

type Struct struct{}

func main() {
        var ps *Struct
        var pi *Interface
        pi = new(Interface)
        *pi = ps

        _, _ = pi, ps
}

Compile bien. Voir aussi ici .

4
zzzz

Voici un moyen très simple d'affecter une structure à une interface:

package main

type Interface interface{}

type Struct struct{}

func main() {
    ps := new(Struct)
    pi := Interface(ps)

    _, _ = pi, ps
}

https://play.golang.org/p/BRTaTA5AG0S

0
Miguel Mota