为了账号安全,请及时绑定邮箱和手机立即绑定

不同返回值实现同一个接口的接口转换

不同返回值实现同一个接口的接口转换

Go
慕森卡 2022-01-17 16:15:11
我正在尝试编写一个涉及模拟几个结构的测试,其中一个结构的函数返回另一个结构的实例。但是,我遇到了可以使用以下代码重现的问题:package maintype 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。谢谢!https://play.golang.org/p/3D2jsSLoI0
查看完整描述

2 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

将接口更多地视为合同。它们不会仅仅因为它们不直接实现任何东西而隐式实现其他接口。


接口由实现满足。(希望这是有道理的)


在您的示例中,两种机器类型都可以创建简单的“材料”,如下所示: 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

}


查看完整回答
反对 回复 2022-01-17
?
12345678_0001

TA贡献1802条经验 获得超5个赞

这是因为您的铅笔机没有实现 Machine2 接口。这是罪魁祸首:


func (pm *PencilMachine) Produce() Material1 {

    return &Pencil{}

}

您会看到,尽管 PencilMachine 具有相同的功能Produce,但它不会返回相同的数据类型(Material1),因此它仅实现 Machine1。Machine2 需要一个Produce函数来返回 Material2


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信