문제

다음 코드가 있습니다.

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

불쾌한 라인을 댓글을 달면 컴파일하고 잘 실행됩니다. 여기서 무슨 일이 일어나고 있습니까? 내가 무엇을 놓치고 있습니까?

도움이 되었습니까?

해결책

업데이트:이 코드는 여기에서 잘 컴파일합니다 (모두 같은 패키지로) :

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

누락 된 것은 *프린터가 유형 객체이며 다른 유형 인 유형 *객체 필드에 할당하려고한다는 것 같습니다.

대부분의 경우 인터페이스 유형에 대한 포인터없이 위와 같이 글을 쓸 것입니다. 그러나 필요한 경우 다음과 같이 컴파일 할 수 있습니다.

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 사양.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top