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
}

オブジェクトも同様です。仕様pに一致するように p のアドレスを取得する必要があります。*Object

于 2009-11-30T04:38:50.843 に答える