2

我想编写一个函数,它需要一个指向任何类型函数的指针。我可以:

func myFunc(f interface{})

...但这将允许非函数值。有什么办法可以将类型限制为任何功能?

4

3 回答 3

5

假设你的字面意思是任何功能,你可以做一个类型切换(这将是具体的):

switch v.(type) {
case func() int:
case func() string:
}

或者您可以使用reflect包来确定类型:

if reflect.TypeOf(v).Kind() != reflect.Func {
    // error here
}

这是一个运行时解决方案。除此之外,你无能为力。这样做的缺点是编译器不会阻止某人传递非函数值。

就我个人而言,我会避免这样做,并且我希望有一个特定的 func 原型,例如:

func myFunc(f func() string)

这样,当编译器知道类型是什么时,您就不太可能出错。

于 2013-08-06T23:49:34.813 回答
1

“任何函数”的概念可以在 Go 中分两步构建:

type MotherOfAllFuncs func()

下一步是将任何函数包装在闭包中,作为匿名类型,闭包与赋值兼容MotherOfAllFuncs

func() {
        anyFunction(with, any, parameters)
}

package main

import "fmt"

type f func()

func g(f f) {
        f()
}

func h(i int) {
        fmt.Println(21 * i)
}

func i() {
        fmt.Println(314)
}

func main() {
        g(func() { h(2) })
        g(func() { i() })
}

操场


输出:

42
314
于 2013-08-07T08:57:02.760 回答
0

函数是Go 中的一等公民。因此它们可以像任何其他类型一样传递给函数并从函数返回。

您可以定义您的函数以将函数作为其参数。

阅读更多 - Go 中的一流函数一流函数

于 2013-08-07T04:39:59.237 回答