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{}
类型的变量。仅仅因为某些东西是可转让的并不意味着它是相同的。