问题内容
现在在我的代码中,我有一堆看起来像这样的重复工作。
type fp = func(arg1 string, arg2 int, arg3 []string) boolfunc decorator(fp fp, arg1 string, arg2 int, arg3 []string) { // do some stuff prior to running fp res := fp(arg1, arg2, arg3) // do some other stuff depending on res}
登录后复制
我的问题是,每次我想添加具有不同数量/类型参数的新 fp 类型时,我都必须重新定义此方法,因此我最终在代码中重新定义了装饰器 4-5 次,并且可能需要多做一点。我想用装饰器替换
type FP = func(a ...interface{}) boolfunc Decorator(fp FP, argDetails interface{}) { // do stuff res := fp(a) // do other stuff}
登录后复制
并让 fp 断言类型。但我不确定这是否会导致问题/是一个糟糕的用例,因为我已经看到很多关于不使用界面/会导致性能问题的内容。
正确答案
由于一些原因,泛型没有帮助,特别是泛型仅对类型有帮助,而对参数的数量没有帮助。就我个人而言,我会以不同的方式解决这个问题:
func decorator(fp func()) { // do stuff fp() // do other stuff}
登录后复制
使用闭包调用它:
var res sometypedecorator(func() { res = originalfunc(arg1, arg2, arg3)})
登录后复制
它在调用站点上有点冗长,但它绝对适用于任何函数签名 – 任何数量或类型的参数以及任何数量或类型的返回值。它甚至可以与方法调用一起使用。听起来你可能正在根据结果做一些逻辑,所以你也可以:
func Decorator(fp func() bool) { // do stuff res := fp() // do other stuff}var res someTypeDecorator(func() bool { res = originalFunc(arg1, arg2, arg3) return res})
登录后复制
即使装饰函数具有比该 bool 更多的返回值,或者如果您想使用其他逻辑(例如,如果它返回一个错误,您想使用 != 转换为 bool),它仍然可以工作。 nil)。
以上就是这是泛型的有效用例吗?的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2360151.html