Можно ли передавать функции с интерфейсами в качестве параметров? - PullRequest
0 голосов
/ 31 марта 2020

Я знаю, что функции можно передавать как параметры. Но я хотел бы использовать функцию, принимающую тип, реализующий интерфейс, в качестве входных данных для функции. Это все еще возможно?

Я пробовал следующее, и это дает cannot use myfn1 (type func(int)) as type fn in argument to test как ошибку.

package main

import "fmt"

type intf interface{}

type fn func(i intf)

func myfn1(i int) {
    fmt.Printf("\ni is %v", i)
}
func myfn2(i int) {
    fmt.Printf("\ni is %v", i)
}
func test(f fn, val int) {
    f(val)
}
func main() {

    test(fn(myfn1), 123)
    test(myfn2, 321)
}

Вы можете попробовать это в: https://play.golang.org/p/Al7USxzmYST

Изменение type fn func(i intf) на type fn func(i int), конечно, решает проблему. Но я не понимаю, можно ли это сделать для работы с интерфейсом.

1 Ответ

2 голосов
/ 31 марта 2020

Вы можете передать любой тип функции в качестве аргумента. Однако, когда вы передаете функцию в качестве аргумента, сигнатура функции должна совпадать. Таким образом, вы не можете передать функцию с интерфейсом вместо функции, которая принимает int.

Передача значения интерфейса в функцию отличается от передачи int. Когда вы вызываете функцию со значением int, она просто передает это значение. Но когда вы передаете значение int в функцию, получающую интерфейс {}, оно должно создать значение интерфейса, содержащее тип значения и само значение, и передать его.

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