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

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,
    }
}



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

最佳答案

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

关于go - 鸭子打字功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57735694/

10-17 02:55