【问题标题】:Can functions with interfaces be passed as parameters?带接口的函数可以作为参数传递吗?
【发布时间】: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。

标签: function go interface


【解决方案1】:

您可以将任何类型的函数作为参数传递。但是,当您将函数作为参数传递时,函数签名必须匹配。因此,您不能传递采用接口的函数来代替采用 int 的函数。

将接口值传递给函数与传递 int 不同。当您调用具有 int 值的函数时,它只是传递该值。但是,当您将 int 值传递给获取 interface{} 的函数时,它必须创建一个包含值类型和值本身的接口值,然后将其传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 2015-09-20
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多