Pergunta

Eu tenho o seguinte 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); 
}

Quando tento compilar, recebo o seguinte erro:

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

Se eu comentar a linha ofensiva, ela compila e funciona bem. O que está acontecendo aqui? o que estou perdendo?

Foi útil?

Solução

Atualizar:Este código compila bem aqui (tudo no mesmo pacote):

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 o que você está faltando é que *a impressora é do tipo de tipo de tipo e você está tentando atribuí -lo a um campo do tipo *objeto, que é um tipo diferente.

Na maioria dos casos, você escreveria como acima - sem ponteiros para interface os tipos - mas, se for necessário, poderá compilar assim:

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

Então p é um objeto, você precisa tomar o endereço de p para corresponder ao *Object especificação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top