Go 方法链和错误处理

我想在 Go 中创建一个方法链 API。在所有示例中,我都可以发现链式操作似乎总是会成功,但我无法保证。因此,我尝试扩展这些以添加错误返回值。


如果我这样做


package main


import "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 报告错误并停止该链?


收到一只叮咚
浏览 230回答 3
3回答

慕码人8056858

有什么好方法可以让 funcA、funcB 和 funcC 报告错误并停止该链?不幸的是,不,您的问题没有好的解决方案。变通方法非常复杂(添加错误通道等),以至于成本超过了收益。方法链不是 Go 中的习惯用法(至少对于可能出错的方法来说不是)。这不是因为方法链有什么特别的错误,而是返回错误而不是恐慌的习惯用法的结果。其他答案是解决方法,但没有一个是惯用的。我可以问一下,在 Go 中链接方法不是因为我们在 Go 中所做的返回错误的后果,还是更普遍的是多个方法返回的结果?好问题,但这不是因为 Go 支持多次返回。Python 支持多个返回,Java 也可以通过一个Tuple<T1, T2>类;方法链在两种语言中都很常见。这些语言可以逃脱它的原因是因为它们惯用地通过异常来传达错误。异常立即停止方法链并跳转到相关的异常处理程序。这是 Go 开发人员通过选择返回错误来特别试图避免的行为。

梦里花落0921

如果您可以控制代码并且函数签名相同,您可以编写如下内容:func ChainCall(fns ...func() (*Chain, error)) (err error) {&nbsp; &nbsp; for _, fn := range fns {&nbsp; &nbsp; &nbsp; &nbsp; if _, err = fn(); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go