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

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

是否可以在 golang 中使用自定義庫觸發編譯時錯誤?

是否可以在 golang 中使用自定義庫觸發編譯時錯誤?

Go
慕容森 2022-01-10 16:55:34
假設,我有min()(例如)一個可變參數函數來定義提供的多個值中的最小值。如果調用者沒有提供任何參數,我想停止編譯過程(因為這將是調用者中的錯誤,而不是我的函數中的錯誤)。怎么做?
查看完整描述

1 回答

?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

調用具有可變參數且不傳遞任何參數的函數在語言規范中是有效的。所以你不能讓它成為編譯時錯誤。


但是,您可以將函數的簽名修改為具有非可變參數和可變參數參數,然后不帶參數調用它確實會出現編譯時錯誤:


func min(first int, rest ...int) int {

    m := first

    for _, v := range rest {

        if v < m {

            m = v

        }

    }

    return m

}

這將強制調用者傳遞至少 1 個參數,否則將是編譯時錯誤。這個min()函數可以這樣調用:


min(1)

min(1, 2)

min(1, 2, -3)

但是試圖在沒有任何參數的情況下調用它會導致編譯時錯誤:


min() // Error: not enough arguments in call to min

如果您希望調用者至少傳遞 2 個參數:


func min(first, second int, rest ...int) int {

    return 0 // Implement your logic here

}

筆記:


如果調用者只想傳遞 1 個參數,上面的示例也更有效,因為可變參數是在后臺使用切片實現的,如果調用者只傳遞 1 個參數,則不必創建nil切片,將傳遞切片(這可以通過打印來驗證rest == nil- 這將是true)。


潛在的缺點是,如果你有一個切片,你不能只將它傳遞給函數,但你可以執行以下操作:


s := []int{1, 2, -3}

fmt.Println(min(s[0], s[1:]...))

這是傳遞第一個元素,并切片切片以傳遞其余部分并使用...將其作為可變參數的值傳遞。不要忘記檢查切片是否至少有 1 個元素,否則上面的代碼會在運行時出現恐慌。


試試Go Playground上的示例。


如果您不能或不想修改函數的簽名,您唯一的選擇是在運行時恐慌或退出應用程序,但在編譯時不可能失敗。


查看完整回答
反對 回復 2022-01-10
  • 1 回答
  • 0 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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