为了账号安全,请及时绑定邮箱和手机立即绑定

用 Go 编写通用活页夹

用 Go 编写通用活页夹

Go
至尊宝的传说 2021-10-04 15:44:27
考虑以下函数——第二个参数的活页夹。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) 中实现活页夹的正确方法吗?
查看完整描述

2 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

我明白你在做什么,一些模板,对吧?但这不会以这种方式工作。您的f func(a interface{}, b interface{})参数不是接口,因此它必须是匹配类型。你可以通过传递来实现你想要的f interface{},然后用 package.json 操作它reflect。


一些天真的例子:


package main


import (

    "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 不会再帮助您了。


查看完整回答
反对 回复 2021-10-04
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

替换interface{}int,它将起作用。

或者,更重要的是,尝试使用 Go 提供的功能找到原始问题的解决方案,而不是尝试从不同的范式中强制解决方案。


查看完整回答
反对 回复 2021-10-04
  • 2 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信