我想在 Go 中创建一个方法链 API。在所有示例中,我都可以发现链式操作似乎总是会成功,但我无法保证。因此,我尝试扩展这些以添加错误返回值。如果我这样做package mainimport "fmt"type Chain struct {}func (v *Chain)funA() (*Chain, error ) { fmt.Println("A") return v, nil}func (v *Chain)funB() (*Chain, error) { fmt.Println("B") return v, nil}func (v *Chain)funC() (*Chain, error) { fmt.Println("C") return v, nil}func main() { fmt.Println("Hello, playground") c := Chain{} d, err := c.funA().funB().funC() // line 24}编译器告诉我chain-err-test.go:24: multiple-value c.funA() in single-value context并且不会编译。有什么好方法可以让 funcA、funcB 和 funcC 报告错误并停止该链?
3 回答
慕码人8056858
TA贡献1803条经验 获得超6个赞
有什么好方法可以让 funcA、funcB 和 funcC 报告错误并停止该链?
不幸的是,不,您的问题没有好的解决方案。变通方法非常复杂(添加错误通道等),以至于成本超过了收益。
方法链不是 Go 中的习惯用法(至少对于可能出错的方法来说不是)。这不是因为方法链有什么特别的错误,而是返回错误而不是恐慌的习惯用法的结果。其他答案是解决方法,但没有一个是惯用的。
我可以问一下,在 Go 中链接方法不是因为我们在 Go 中所做的返回错误的后果,还是更普遍的是多个方法返回的结果?
好问题,但这不是因为 Go 支持多次返回。Python 支持多个返回,Java 也可以通过一个Tuple<T1, T2>
类;方法链在两种语言中都很常见。这些语言可以逃脱它的原因是因为它们惯用地通过异常来传达错误。异常立即停止方法链并跳转到相关的异常处理程序。这是 Go 开发人员通过选择返回错误来特别试图避免的行为。
梦里花落0921
TA贡献1772条经验 获得超6个赞
如果您可以控制代码并且函数签名相同,您可以编写如下内容:
func ChainCall(fns ...func() (*Chain, error)) (err error) {
for _, fn := range fns {
if _, err = fn(); err != nil {
break
}
}
return
}
- 3 回答
- 0 关注
- 229 浏览
添加回答
举报
0/150
提交
取消