2 回答

TA貢獻1951條經驗 獲得超3個贊
你的導師是對的:不要重復代碼。它被稱為DRY 主體。
但是 Go 的作者在設計語言時采取了不同的方向。它破壞了開發(fā)社區(qū),引發(fā)了戰(zhàn)爭,扭曲了空間和時間。
這些方向之一是接受一點點復制,使代碼更易于閱讀。 正如您所注意到的,錯誤處理就是這樣一個領域。它邀請了一些重復的模式來檢查整個應用程序中的 nil,而不是抽象掉(并且很容易忽略)您應該做的真正的錯誤處理。
Rob Pike 在他的 GoLang 設計(和哲學)演講中談到了這個方向:
http://talks.golang.org/2012/splash.article
如果錯誤使用特殊的控制結構,錯誤處理會扭曲處理錯誤的程序的控制流。類 Java 風格的 try-catch-finally 塊交織多個重疊的控制流,這些控制流以復雜的方式交互。盡管相比之下 Go 使檢查錯誤更加冗長,但顯式設計使控制流保持直截了當——字面意思。
不是每個人都同意,這就是戰(zhàn)爭開始的原因。
但是,這些改變行業(yè)標準的決定給開發(fā)人員帶來了巨大的負擔,這正是他們這樣做的原因:您每次都被迫提前和集中處理每個錯誤。你不能忽視或讓其他東西來處理它。
并非所有人都同意。
我強烈建議您和您的 Tutur 閱讀有關 Go 設計的帖子。然后你們兩個可以決定寧Go是去還是不去。

TA貢獻1843條經驗 獲得超7個贊
只是為了添加已經很好的答案,您可以使您的checkError功能更加個性化,因此您仍然可以預先處理錯誤,同時仍然保持干燥:
func checkError(err error, handler func(e error)) {
if err != nil {
handler(err)
}
}
通過這種方式,您可以傳入要用于每個錯誤的處理程序函數(shù),而不會忘記責任,同時節(jié)省兩行重復的錯誤處理代碼。
handler1 = func(e error) {
panic(e)
}
handler2 = func(e error) {
log.Fatal(e)
}
func foobar(str string) err {
_, err := ioutil.ReadAll(resp.Body)
checkError(err, handler2)
}
- 2 回答
- 0 關注
- 145 瀏覽
添加回答
舉報