3 回答

TA貢獻1789條經驗 獲得超10個贊
一種解決方案是針對go generate
您的P()
功能,針對您需要使用的每種具體類型。
請參閱以下示例:
"使用 "?
go generate
"?"在 Go 中進行通用編程。“喬肖/根根”
“厚臉皮/珍妮”
“剪刀屋/一代”
“在 Go 中實現類型泛型函數,不使用反射”
這將使調用這些 lib 函數變得更容易,因為生成的具體 P() 實現將使用正確的類型而不是 interface{}。

TA貢獻1805條經驗 獲得超10個贊
您想要做的將需要泛型,但正如您已經提到的,Go 不支持泛型類型。因此,您無法創建不會丟失類型的通用函數。
您必須為要支持的每種類型創建這樣的函數。請注意,標準庫已經包含其中一些名稱為MustXXX()
,您可以開箱即用,例如:
template.Must(t *Template, err error) *Template
或者“類似”的功能,它們抑制error
但如果仍然發生,恐慌,例如:
regexp.MustCompile(str string) *Regexp
(error
如果str
不是有效的正則表達式,則抑制但恐慌)

TA貢獻1798條經驗 獲得超7個贊
如果您計劃只是對錯誤感到恐慌(壞主意)或記錄它們,那么只需定義一個函數來執行此操作并使用它。例如
func checkErr(err error) {
if err != nil {
log.Println(err)
}
}
// ...
func foo() {
a, err := doA()
checkErr(err)
b, err := doB()
checkErr(err)
// etc.
}
用戶 twotwotwo 已經鏈接到Errors are values文章,該文章展示了更多關于如何減少錯誤處理重復性的示例。但我建議只寫整個if err != nil事情,因為根據我的經驗,每三個錯誤,如果不是第二個,都需要一些額外的處理。
- 3 回答
- 0 關注
- 243 瀏覽
添加回答
舉報