鸭式打字功能

时间:2019-08-31 06:22:58

标签: go compiler-errors

当我尝试使用接口而不是实际结构作为函数的返回值时,编译器会出错。用鸭子打字不行吗?

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>

https://play.golang.org/p/gfwMgiC6WLP

1 个答案:

答案 0 :(得分:0)

这里要寻找的概念是类型系统中的差异。某些类型系统和类型支持协方差和协方差,但Go的接口不支持。 参见https://stackoverflow.com/a/54751503/1406669