3 回答

TA貢獻1803條經驗 獲得超6個贊
有什么好方法可以讓 funcA、funcB 和 funcC 報告錯誤并停止該鏈?
不幸的是,不,您的問題沒有好的解決方案。變通方法非常復雜(添加錯誤通道等),以至于成本超過了收益。
方法鏈不是 Go 中的習慣用法(至少對于可能出錯的方法來說不是)。這不是因為方法鏈有什么特別的錯誤,而是返回錯誤而不是恐慌的習慣用法的結果。其他答案是解決方法,但沒有一個是慣用的。
我可以問一下,在 Go 中鏈接方法不是因為我們在 Go 中所做的返回錯誤的后果,還是更普遍的是多個方法返回的結果?
好問題,但這不是因為 Go 支持多次返回。Python 支持多個返回,Java 也可以通過一個Tuple<T1, T2>
類;方法鏈在兩種語言中都很常見。這些語言可以逃脫它的原因是因為它們慣用地通過異常來傳達錯誤。異常立即停止方法鏈并跳轉到相關的異常處理程序。這是 Go 開發人員通過選擇返回錯誤來特別試圖避免的行為。

TA貢獻1772條經驗 獲得超6個贊
如果您可以控制代碼并且函數簽名相同,您可以編寫如下內容:
func ChainCall(fns ...func() (*Chain, error)) (err error) {
for _, fn := range fns {
if _, err = fn(); err != nil {
break
}
}
return
}
- 3 回答
- 0 關注
- 261 瀏覽
添加回答
舉報