Потому что типы не совпадают. Представьте себе:
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
.