我想编写一个函数,它需要一个指向任何类型函数的指针。我可以:
func myFunc(f interface{})
...但这将允许非函数值。有什么办法可以将类型限制为任何功能?
我想编写一个函数,它需要一个指向任何类型函数的指针。我可以:
func myFunc(f interface{})
...但这将允许非函数值。有什么办法可以将类型限制为任何功能?
假设你的字面意思是任何功能,你可以做一个类型切换(这将是具体的):
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)
这样,当编译器知道类型是什么时,您就不太可能出错。
“任何函数”的概念可以在 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