Понятие, которое вы ищете здесь: дисперсия в системе типов .Некоторые системы типов и типы поддерживают ковариацию и контравариантность , но интерфейсы 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{}
.
В дополнение к ссылке на Википедию в верхней части ответа, в этом посте представлены дополнительные сведения о различных видах поддержки языков программирования с дисперсией.Он в основном использует другие языки, потому что дисперсия лучше всего демонстрируется с языками, которые поддерживают наследование.