Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 使用不同返回值实现同一接口的接口转换_Go - Fatal编程技术网

Go 使用不同返回值实现同一接口的接口转换

Go 使用不同返回值实现同一接口的接口转换,go,Go,新的开始。我正在尝试编写一个测试,其中包括模拟两个结构,其中一个结构的函数返回另一个结构的实例。但是,我遇到了一个问题,我可以用以下代码重现: 主程序包 类型Machine1接口{ 生产()材料1 } 类型Machine2接口{ 生产()材料 } 类型Material1接口{ Use()错误 } 类型Material2接口{ Use()错误 } 类型PencilMachine结构{} func(pm*铅笔机)生产()材料1{ 返回和铅笔{} } 类型铅笔结构{} func(p*铅笔)使用()错误

新的开始。我正在尝试编写一个测试,其中包括模拟两个结构,其中一个结构的函数返回另一个结构的实例。但是,我遇到了一个问题,我可以用以下代码重现:

主程序包
类型Machine1接口{
生产()材料1
}
类型Machine2接口{
生产()材料
}
类型Material1接口{
Use()错误
}
类型Material2接口{
Use()错误
}
类型PencilMachine结构{}
func(pm*铅笔机)生产()材料1{
返回和铅笔{}
}
类型铅笔结构{}
func(p*铅笔)使用()错误{
归零
}
func main(){
pm:=新的(铅笔机)
var m1机器1
m1=机器1(pm)
var m2机器2
m2=机器2(m1)
_=平方米
}
这会产生以下错误:

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)product()的返回类型是Material1而不是Material2。奇怪为什么这不起作用,因为任何实现Material1的东西也实现Material2

谢谢


将接口更多地视为合同。由于它们没有直接实现任何东西,所以它们不会隐式实现其他接口

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

在您的示例中,使用两种meachine类型创建的简单“材质”将起作用,如下所示:


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

func (pm *PencilMachine) Produce() Material1 {
    return &Pencil{}
}
您可以看到,尽管PencilMachine具有相同的函数
product
,但它并不返回相同的数据类型(Material1),因此它只实现了Machine1。机器2需要一个
product
函数来返回材料2

请看以下内容:
func (pm *PencilMachine) Produce() Material1 {
    return &Pencil{}
}