2009-11-30 11 views
3

Je le code suivant:Ne peut pas utiliser (* struct) comme (* Interface) en valeur du champ

// eventloop.go 
type Object interface { 
    ActivateSlot(name string, parameters vector.Vector); 
} 



// main.go 
import loop "./eventloop" 

// ... 

const slotname = "printer" 

type printer struct { 
    slot loop.Slot; 
} 

func (p *printer) Init() { 
    p.slot = loop.Slot{slotname, p}; // offending line 
} 

func (p *printer) ActivateSlot(name string, parameters vector.Vector) { 
    fmt.Println("Slot called: ", name); 
} 

Lorsque je tente de compiler, je reçois l'erreur suivante:

[email protected] ~/workspace/go $ ./build.sh 
main.go:23: cannot use p (type *printer) as type *eventloop.Object in field value 

Si Je commente la ligne offensante, elle compile et fonctionne bien. Qu'est-ce qu'il se passe ici? Qu'est-ce que je rate?

Répondre

1

Mise à jour: Ce code compile bien ici (tous dans le même paquet):

type Object interface { 
    ActivateSlot(name string, parameters vector.Vector); 
} 
type Slot struct { 
    name string; 
    stuff Object; 
} 

const slotname = "printer" 
type printer struct { 
    slot Slot; 
} 
func (p *printer) Init() { 
    p.slot = Slot{slotname, p}; // offending line 
} 
func (p *printer) ActivateSlot(name string, parameters vector.Vector) { 
    fmt.Println("Slot called: ", name); 
} 

Il semble que ce qui vous manque est que * imprimante est de type objet, et vous essayez de l'affecter à un champ de type * Object, qui est un type différent.

Dans la plupart des cas, vous écrivez comme ci-dessus - sans pointeurs pour interfacer types - mais si vous devez, vous pouvez le faire compiler comme ceci:

type Slot struct { 
    name string; 
    stuff *Object; 
} 
func (p *printer) Init() { 
    var o Object = p; 
    p.slot = Slot{slotname, &o}; // offending line 
} 

Alors p est un objet, vous devez prendre l'adresse de p pour correspondre à la spécification *Object.

+0

eventloop.Object est une interface. En théorie, tout type satisfait celui qui implémente la fonction déclarée. Il n'y a pas de type eventloop.Object explicite. –

+0

C'est l'interface Object en haut de votre code? Oui, si cela est défini dans le package eventloop et contient juste cette méthode, cela devrait fonctionner. Avez-vous essayé avec un casting? –

+2

Si Object est une interface, avez-vous spécifié votre emplacement comme type * Object? Cela ne fonctionne pas - * L'imprimante est de type Objet, pas de type * Objet –