필드 값에서 (*struct) AS (*interface)를 사용할 수 없습니다.
문제
다음 코드가 있습니다.
// 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
사양.
제휴하지 않습니다 StackOverflow