3 回答

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

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

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