我尝试编写一个函数,它接受任何其他函数并在其周围包装一个新函数 . 这是我到目前为止所尝试的:
package main
import (
"fmt"
)
func protect (unprotected func (...interface{})) (func (...interface{})) {
return func (args ...interface{}) {
fmt.Println ("protected");
unprotected (args...);
};
}
func main () {
a := func () {
fmt.Println ("unprotected");
};
b := protect (a);
b ();
}
当我编译这个时,我得到错误:
cannot use a (type func()) as type func(...interface { }) in function argument
为什么没有参数的函数与具有可变数量参数的函数不兼容?我该怎么做才能使它们兼容?
Update: 受保护的功能应与原始功能兼容:
func take_func_int_int (f func (x int) (y int)) (int) {
return f (1)
}
func main () {
a := func (x int) (y int) {
return 2 * x
}
b := protect (a)
take_func_int_int (a)
take_func_int_int (b)
}
2 回答
Go中的类型非常具体 . 你可以试试
func (...interface{})
并不意味着"any function that takes any number of any kind of arguments",这意味着"only a function which takes a variable number of interface{} arguments"或者,而不是
func(...interface{})
,您可以使用interface{}
和reflect
包 . 有关示例,请参见http://github.com/hoisie/web.go .编辑:具体来说,这个:
输出是
编辑:回答更新
就像我上面说的那样,Go中的类型非常具体 . 保护功能返回
func(...interface{})
类型,永远不会分配给func(int)int
. 我认为你是一个非常气馁的代码片段,它会让它发挥作用 .首先改变保护也返回值:
然后做一个转换函数:
然后你的电话会是这样的
但我保证这不是你真正想做的事情 .
退一步,尝试重做问题 . 在这些例子中,我完全杀死了类型安全 . 你想达到什么目的?