我知道函数可以作为参数传递。但是我想使用一个带有实现接口的类型的函数作为函数的输入。这还有可能吗?
我已经尝试了以下方法,它给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)
当然可以解决此问题。但是我不知道是否可以使其与接口一起使用。 最佳答案
您可以传递任何类型的函数作为参数。但是,当您将函数作为参数传递时,函数签名必须匹配。因此,您不能通过带有接口的函数来代替带有int的函数。
将接口值传递给函数与将int传递给函数是不同的。当您使用int值调用函数时,它只是传递该值。但是,当您将int值传递给获取interface {}的函数时,它必须创建一个包含值类型和值本身的接口值,然后将其传递。