亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 261 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號