1 回答

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上的示例。
如果您不能或不想修改函數的簽名,您唯一的選擇是在運行時恐慌或退出應用程序,但在編譯時不可能失敗。
- 1 回答
- 0 關注
- 175 瀏覽
添加回答
舉報