Функция типа Голанга с ошибкой несовместимого параметра интерфейса - PullRequest
0 голосов
/ 18 февраля 2019

Я объявил новый тип func, который принимает любое значение, соответствующее interface{}.Однако, когда я вызываю функцию, которая была передана в качестве аргумента (в соответствии с этой спецификацией типа), я получаю ошибку.

Может кто-нибудь объяснить, почему это так?Ниже приведен простейший пример, с которым я мог бы воссоздать проблему.

type myfunc func(x interface{})

func a(num int) {
    return
}

func b(f myfunc) {
    f(2)
    return
}

func main() {
    b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b
    return
}

1 Ответ

0 голосов
/ 18 февраля 2019

Понятие, которое вы ищете здесь: дисперсия в системе типов .Некоторые системы типов и типы поддерживают ковариацию и контравариантность , но интерфейсы Go не поддерживают.

В то время как int можно передать функции, которая ожидает interface{}то же самое нельзя сказать о func(int) и func(interface{}), поскольку интерфейсы не ведут себя ковариантно.

Если тип x реализует интерфейс ii, это не означает, что func(x) реализует func(ii).

Что вы могли бы сделать, это передать func(int) в функцию, которая ожидает interface{}, чтобы вы могли сделать

package main

import "fmt"

func foo(x interface{}) {
    fmt.Println("foo", x)
}

func add2(n int) int {
    return n + 2
}

func main() {
    foo(add2)
}

Поскольку func(int)int делает внедрить interface{}.


В дополнение к ссылке на Википедию в верхней части ответа, в этом посте представлены дополнительные сведения о различных видах поддержки языков программирования с дисперсией.Он в основном использует другие языки, потому что дисперсия лучше всего демонстрируется с языками, которые поддерживают наследование.

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