Нельзя использовать (* struct) как (* interface) в значении поля - PullRequest
3 голосов
/ 30 ноября 2009

У меня есть следующий код:

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

Когда я пытаюсь скомпилировать, я получаю следующую ошибку:

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

Если я прокомментирую оскорбительную строку, она компилируется и работает нормально Что тут происходит? Чего мне не хватает?

1 Ответ

2 голосов
/ 30 ноября 2009

Обновление: Этот код прекрасно компилируется здесь (все в одном пакете):

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

Похоже, вам не хватает * принтера типа Object, и вы пытаетесь присвоить его полю типа * Object другого типа.

В большинстве случаев вы бы написали это, как указано выше - без указателей на типы интерфейса - но если вам нужно, вы можете заставить его скомпилироваться следующим образом:

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

Итак, p - это объект, вам нужно взять адрес p, чтобы соответствовать спецификации *Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...