Go的新手。我正在尝试编写一个涉及模拟几个结构的测试,其中一个结构的函数返回另一个结构的实例。但是我遇到了一个问题,我可以使用以下代码重现:
package main
type Machine1 interface {
Produce() Material1
}
type Machine2 interface {
Produce() Material2
}
type Material1 interface {
Use() error
}
type Material2 interface {
Use() error
}
type PencilMachine struct{}
func (pm *PencilMachine) Produce() Material1 {
return &Pencil{}
}
type Pencil struct{}
func (p *Pencil) Use() error {
return nil
}
func main() {
pm := new(PencilMachine)
var m1 Machine1
m1 = Machine1(pm)
var m2 Machine2
m2 = Machine2(m1)
_ = m2
}
出现以下错误:
prog.go:38: cannot convert m1 (type Machine1) to type Machine2:
Machine1 does not implement Machine2 (wrong type for Produce method)
have Produce() Material1
want Produce() Material2
注意Pencil结构如何实现Material1和Material2接口。但是(pm * PencilMachine)Produce()的返回类型是Material1而不是Material2。好奇为什么这不起作用,因为实现Material1的任何东西都实现了Material2。
谢谢!
答案 0 :(得分:1)
将接口更多地视为契约。它们不会隐式地实现其他接口,因为它们没有直接实现任何东西。
实现满足和接口。 (希望这很有意义)
在您的示例中,使用meachine类型创建的简单“材质”将起作用,如下所示:https://play.golang.org/p/ZoYJog2Xri
package main
type Machine1 interface {
Produce() Material
}
type Machine2 interface {
Produce() Material
}
type Material interface {
Use() error
}
type PencilMachine struct{}
func (pm *PencilMachine) Produce() Material {
return &Pencil{}
}
type Pencil struct{}
func (p *Pencil) Use() error {
return nil
}
func main() {
pm := new(PencilMachine)
var m1 Machine1
m1 = Machine1(pm)
var m2 Machine2
m2 = Machine2(m1)
_ = m2
}
答案 1 :(得分:0)
这是因为您的铅笔机没有实现Machine2接口。这是罪魁祸首:
func (pm *PencilMachine) Produce() Material1 {
return &Pencil{}
}
你看,尽管PencilMachine具有相同的函数Produce
,但它不会返回相同的数据类型(Material1),因此它只实现了Machine1。 Machine2需要Produce
函数才能返回Material2