用 Go 编写通用活页夹

考虑以下函数——第二个参数的活页夹。


func bindSecond(value interface{}, f func(a interface{}, b interface{})) func (c interface{}) {

    return func(arg interface{}) {

        f(arg, value)

    }

}

考虑一个函数


func f(x int, y int) {}

当尝试将其用作绑定器中的参数时,go 编译器说:


cannot use f (type func(int, int)) as type func(interface {}, interface {}) in argument to bindSecond.

你能建议我在 go (golang) 中实现活页夹的正确方法吗?


至尊宝的传说
浏览 197回答 2
2回答

白衣染霜花

我明白你在做什么,一些模板,对吧?但这不会以这种方式工作。您的f func(a interface{}, b interface{})参数不是接口,因此它必须是匹配类型。你可以通过传递来实现你想要的f interface{},然后用 package.json 操作它reflect。一些天真的例子:package mainimport (    "fmt"    "reflect")func bindSecond(value interface{}, f interface{}) func(c interface{}) {    return func(arg interface{}) {        reflect.ValueOf(f).Call([]reflect.Value{reflect.ValueOf(arg), reflect.ValueOf(value)})    }}func main() {    sum := func(x int, y int) { fmt.Println(x + y) }    inc := bindSecond(1, sum)    inc(10)}// Prints 11可行,但不是很漂亮。如果发生任何意外,运行时会发生恐慌,例如f不可调用且不完全采用两个参数。或者您将错误的类型传递给inc. Complier 不会再帮助您了。

犯罪嫌疑人X

替换interface{}为int,它将起作用。或者,更重要的是,尝试使用 Go 提供的功能找到原始问题的解决方案,而不是尝试从不同的范式中强制解决方案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go