当我尝试使用接口而不是实际结构作为函数的返回值时,编译器会出错。用鸭子打字不行吗?
package main
import (
"os/exec"
)
type Runner interface {
Run() error
}
type My struct {
Cmd func(name string, arg ...string) Runner
}
func main() {
compiles := My{
Cmd: func(name string, arg ...string) Runner {
return exec.Command(name, arg...)
},
}
doesNotCompile := My{
Cmd: exec.Command,
}
}
./ prog.go:22:3:无法将exec.Command(func(string,... string)* exec.Cmd类型)用作func(string,... string)类型字段值中的转轮< / p>
答案 0 :(得分:0)
这里要寻找的概念是类型系统中的差异。某些类型系统和类型支持协方差和协方差,但Go的接口不支持。 参见https://stackoverflow.com/a/54751503/1406669