6

我有以下代码:

// 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

如果我将有问题的行注释掉,它会编译并运行良好。这里发生了什么事?我错过了什么?

4

1 回答 1

4

更新: 此代码在这里编译得很好(都在同一个包中):

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

您似乎缺少的是 *printer 是 Object 类型,而您正试图将其分配给 *Object 类型的字段,这是一种不同的类型。

在大多数情况下,你会像上面那样编写它——没有指向接口类型的指针——但如果你必须这样做,你可以让它像这样编译:

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

Object也是如此p,你需要取p的地址来匹配*Object规范。

于 2009-11-30T04:38:50.843 回答