Go 带接口参数的Func不等于带字符串参数的Func。为什么?

Go 带接口参数的Func不等于带字符串参数的Func。为什么?,go,Go,我不明白是什么问题。 以下是示例代码: 类型接口函数func(i接口{}) func main(){ var notOk InterfaceFunction=func(s字符串){} var ok InterfaceFunction=func(i接口{}){} } 因为类型不同。想象一下: type InterfaceFunction func(i interface{}) func main() { var notOk InterfaceFunction = func(s strin

我不明白是什么问题。 以下是示例代码:

类型接口函数func(i接口{})
func main(){
var notOk InterfaceFunction=func(s字符串){}
var ok InterfaceFunction=func(i接口{}){}
}

因为类型不同。想象一下:

type InterfaceFunction func(i interface{})

func main() {
    var notOk InterfaceFunction = func(s string){}
    myFunc(InterfaceFunction(notOk))    // This can't possibly work!
}

func myFunc(fn InterfaceFunction) {
    x := 17
    fn(x)   // This is legal, because InterfaceFunction takes an interface{}
}

这里我们的
myFunc
采用
InterfaceFunction
,根据定义,它采用任何
interface{}
作为参数
myFunc
可以传递它想要的任何内容。如果允许我们在这里使用
func(string)
作为
func(interface{})
myFunc
将不再具有编译时类型安全性:它将把
int
传递给接受
string

的函数,因为它们不是一回事。
interface{}
并不意味着“任何类型”;这意味着只要
interface{}
@Volker,但当我们调用fmt.Println(“1234”,1234)时,在运行时,
interface{}
将接受任何类型,如
int
string
。但是作为一个类型定义,
接口{}
字符串
不匹配/相等。“存在”和“可以分配给”之间有一个主要区别
interface{}
只是
interface{}
它既不是
int
也不是
string
或其他任何东西。但是您可以将任何类型的任何值分配给
interface{}
类型的变量。仅仅因为某些东西是可转让的并不意味着它是相同的。