Fun c с аргументом интерфейса не равно fun c со строковым аргументом. Почему? - PullRequest
0 голосов
/ 18 февраля 2020

Я не могу понять, в чем проблема. Вот пример кода:

type InterfaceFunction func(i interface{})
func main() {
    var notOk InterfaceFunction = func(s string){}
    var ok InterfaceFunction = func(i interface{}){}
}

1 Ответ

1 голос
/ 18 февраля 2020

Потому что типы не совпадают. Представьте себе:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...