错误处理 – 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:单值上下文中的多值c.funA(),不会编译.有没有一个很好的方法,所以funcA,funcB和funcC可以报告错误并停止该链?

最佳答案

Is there a good way so funcA, funcB and funcC can report an error and stop that chain?

不幸的是,不,你的问题没有好的解决方案.解决方法足够复杂(添加错误通道等)成本超过增益.

方法链接不是Go中的一个成语(至少不是可能会出错的方法).这不是因为方法链有什么特别的错误,而是返回错误而不是恐慌的成语的结果.其他答案是解决方法,但没有一个是惯用的.

Can I ask, is it not idiomatic to chain methods in Go because of the consequence of returning error as we do in Go, or is it more generally a consequence of having multiple method returns?

好的问题,但不是因为Go支持多个回报. Python支持多个返回,Java也可以通过Tuple< T1,T2>类;方法链在两种语言中都是常见的.这些语言可以摆脱的原因是因为他们通过异常习惯性地传达错误.异常立即停止方法链,并跳转到相关的异常处理程序.这是Go开发人员通过选择返回错误而专门设法避免的行为.

转载注明原文:错误处理 – Go方法链接和错误处理 - 代码日志