【发布时间】:2020-07-12 08:28:47
【问题描述】:
我知道函数可以作为参数传递。但我想使用一个函数,该函数采用实现接口的类型作为函数的输入。这还有可能吗?
我已经尝试了以下方法,它给出了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) 当然可以解决问题。但我不明白它是否可以与界面一起使用。
【问题讨论】:
-
它绝对可以传递一个接受接口类型参数的函数;他们没有什么特别的。但是因为它们没有什么特别之处,你只能将它们传递给一个接受该类型函数的函数。
-
换句话说,你传递的函数的签名必须完全匹配你传递给它的参数的签名。
-
test 需要一个接受任何 intf 的函数,而您正试图给它一个只接受 int 的函数。这不适用于 任何 语言,而不仅仅是 Go。