Pregunta

Tengo el siguiente código:

// 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); 
}

Cuando intento compilar, aparece el siguiente error:

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

Si comento la línea ofensiva, se compila y funciona bien. ¿Que esta pasando aqui? ¿Qué me estoy perdiendo?

¿Fue útil?

Solución

Actualización: Este código se compila bien aquí (todo en el mismo paquete):

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);
}

Parece que lo que falta es que * la impresora es de tipo Object, y está tratando de asignarla a un campo de tipo * Object, que es un tipo diferente.

En la mayoría de los casos, lo escribiría como arriba, sin punteros a los tipos de interfaz, pero si tiene que hacerlo, puede compilarlo así:

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

Entonces p es un Objeto, debe tomar la dirección de p para que coincida con la especificación * Object .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top