亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何編寫一個函數,該函數采用 go 中的多種類型之一?

如何編寫一個函數,該函數采用 go 中的多種類型之一?

Go
達令說 2021-11-29 16:55:49
我正在嘗試進行一個小項目并嘗試編寫這些函數:func fatal(reason string) {    println(reason)    os.Exit(1)}func fatal(err error) {    fatal(err.Error())}在挖掘了一下并找到這個答案后,它引用了有關重載的文檔,我意識到我試圖做的事情在 go 中是非法的。我想要的是一個簡單的 api,它允許我使用字符串或錯誤調用致命以簡化我的邏輯。我如何實現這個或類似的目標?func fatal(reason string)和 在一起會感覺不雅func fatalErr(err error),這是需要的嗎?我是否錯過了語言的一個不同功能,它可以讓我做我想做的事?
查看完整描述

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,因為它有關于這兩個功能的部分。


查看完整回答
反對 回復 2021-11-29
?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

使用 log.Fatal() 代替。https://golang.org/pkg/log/#Fatal

您可以使用 interface{},但不推薦使用,因為這樣做會失去類型檢查的所有好處。Go 作者開始使用 interface{},因為他們了解使用 interface{} 時要進行的適當級別的額外測試和檢查。當需要這樣的東西時,使用內置和標準庫函數要容易得多(即使對于中級和高級地鼠)。

Go 也沒有代數或/和類型。標準的解決方法是使用指針定義和/產品類型(例如 struct{*string, *error}),并努力確保在任何時間點都只將字段之一設為非 nil。


查看完整回答
反對 回復 2021-11-29
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

該語言不支持函數重載。從官方 Golang 網站上說,

如果不需要進行類型匹配,則方法分派會得到簡化。使用其他語言的經驗告訴我們,擁有多種名稱相同但簽名不同的方法有時很有用,但在實踐中也可能令人困惑和脆弱。僅按名稱匹配并要求類型的一致性是 Go 類型系統中一個主要的簡化決定。關于運算符重載,它似乎更方便而不是絕對要求。同樣,沒有它,事情會更簡單。

https://golang.org/doc/faq#overloading

一種可能的解決方案是定義一個高級函數,該函數可以類似于重載多個函數的方式來檢查和處理不同的類型。請參閱@evanmcdonnal 的解決方案以獲取一個很好的示例。


查看完整回答
反對 回復 2021-11-29
  • 3 回答
  • 0 關注
  • 210 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號