3 回答

TA貢獻2011條經驗 獲得超2個贊
最常見的方法是定義方法,func fatal(err interface{})然后進行類型斷言或在其主體內使用類型開關來處理每種不同的類型。如果我為你的例子編碼,它看起來像這樣;
func fatal(err interface{}) {
if v, ok := err.(string); ok {
fmt.Println(v)
}
if v, ok := err.(error); ok {
fmt.Println(v.Error())
} else {
// panic ?
}
}
還; 這是有關類型切換和斷言的快速閱讀,可能會有所幫助;http://blog.denevell.org/golang-interface-type-assertions-switch.html 您還可以查看 Effective-go,因為它有關于這兩個功能的部分。

TA貢獻1858條經驗 獲得超8個贊
使用 log.Fatal() 代替。https://golang.org/pkg/log/#Fatal
您可以使用 interface{},但不推薦使用,因為這樣做會失去類型檢查的所有好處。Go 作者開始使用 interface{},因為他們了解使用 interface{} 時要進行的適當級別的額外測試和檢查。當需要這樣的東西時,使用內置和標準庫函數要容易得多(即使對于中級和高級地鼠)。
Go 也沒有代數或/和類型。標準的解決方法是使用指針定義和/產品類型(例如 struct{*string, *error}),并努力確保在任何時間點都只將字段之一設為非 nil。

TA貢獻1806條經驗 獲得超5個贊
該語言不支持函數重載。從官方 Golang 網站上說,
如果不需要進行類型匹配,則方法分派會得到簡化。使用其他語言的經驗告訴我們,擁有多種名稱相同但簽名不同的方法有時很有用,但在實踐中也可能令人困惑和脆弱。僅按名稱匹配并要求類型的一致性是 Go 類型系統中一個主要的簡化決定。關于運算符重載,它似乎更方便而不是絕對要求。同樣,沒有它,事情會更簡單。
https://golang.org/doc/faq#overloading
一種可能的解決方案是定義一個高級函數,該函數可以類似于重載多個函數的方式來檢查和處理不同的類型。請參閱@evanmcdonnal 的解決方案以獲取一個很好的示例。
- 3 回答
- 0 關注
- 210 瀏覽
添加回答
舉報