【发布时间】:2014-12-04 15:26:01
【问题描述】:
我想在 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报错并停止该链?
【问题讨论】:
-
您可以使用 panic,但这当然意味着您必须在每种方法上或在其根源上进行恢复。您还可以使
Chain对象有错误并检查每个方法。 -
@Not_a_Golfer 是的,但我想知道是否有一种很好的惯用方式来做到这一点。在我的世界中,错误条件无处不在,并且在某些地方(即golangpatterns.info/object-oriented/operators 中的运算符)这样的链接应该提供一个很好的API。 (该页面上的第一个示例,即不是一个很好的 API - 要么你有大量适用于所有类型的函数,要么编译器没有检测到错误类型的开关)
-
我记得有一个更好的 API 涉及返回函数的函数,如 dave.cheney.net/2014/10/17/functional-options-for-friendly-apis(在 commandcenter.blogspot.com.au/2014/01/… 之后完成)。但它并不完全是“链接”。
-
@johannes 我做了类似的事情,但使用通道链接输出流,并且错误只是关闭了通道,结束了整个链。不过,这可能不是您所需要的。
-
我知道这不是您要寻找的答案,但惯用的做法是避免链接。链接没有错,但这是使用错误值而不是异常的习惯用法的结果。
标签: error-handling go chaining