我有以下代码:
// 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);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,出现以下错误:
jurily@jurily ~/workspace/go $ ./build.sh
main.go:23: cannot use p (type *printer) as type *eventloop.Object in field value
Run Code Online (Sandbox Code Playgroud)
如果我将有问题的行注释掉,它将编译并运行良好。这里发生了什么事?我想念什么?
更新: 此代码在这里可以正常编译(全部在同一个包中):
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);
}
Run Code Online (Sandbox Code Playgroud)
看来您缺少的是 *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
}
Run Code Online (Sandbox Code Playgroud)
一个Object也是如此p,你需要取p的地址来匹配*Object规范。
| 归档时间: |
|
| 查看次数: |
5455 次 |
| 最近记录: |