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

Go 方法链和错误处理

Go 方法链和错误处理

Go
收到一只叮咚 2021-09-09 15:25:56
我想在 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 开发人员通过选择返回错误来特别试图避免的行为。


查看完整回答
反对 回复 2021-09-09
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

如果您可以控制代码并且函数签名相同,您可以编写如下内容:


func ChainCall(fns ...func() (*Chain, error)) (err error) {

    for _, fn := range fns {

        if _, err = fn(); err != nil {

            break

        }

    }

    return

}


查看完整回答
反对 回复 2021-09-09
  • 3 回答
  • 0 关注
  • 229 浏览
慕课专栏
更多

添加回答

举报

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