2 回答

TA貢獻1797條經驗 獲得超6個贊
Go 不知道這一點// this condition doesn't occur,并且在分析您的代碼時,它會看到如果沒有if滿足語句的條件,則它缺少返回值。
“解決”此問題的一種方法是執行類似panic("does not occur"). 不過,我不喜歡這樣,因為多年來我遇到了太多的日志條目說“不會發生”......
或者,您可以使用 Go 中可能更自然的方法:
if cond1 {
return v1
}
if cond2 {
return v2
}
//... other cases ...
return v3
或者甚至是一個 switch 語句:
switch {
case cond1:
return v1
case cond2:
return v2
//... other cases ...
default:
return v3
}
您使用的“else if”是不必要的,因為每種情況都會導致函數立即返回。檢查 Effective Go 以了解此模式。它也在標準庫中被廣泛使用(即,避免不必要的 else's)。
另外,由于您說絕對不可能所有條件都是錯誤的,因此無需測試最后一個:這是“其他”情況。

TA貢獻1851條經驗 獲得超3個贊
您明確指出函數 f 返回一個 int,問題是此函數中存在條件不滿足您的任何 if...elseif 條件的情況:
package main
import "fmt"
func main() {
fmt.Println(Paths(0, 0))
fmt.Println(Paths(1, 0))
fmt.Println(Paths(0, 1))
}
func Paths(m int, n int) int {
length := m
width := n
var f func(int, int) int
f = func(h int, v int) int {
if h == length && v == width {
return 1
} else if h < width && v < width {
return f(h, v+1) + f(h+1, v)
} else if v < length {
return f(h, v+1)
} else if h < width {
return f(h+1, v)
} else { // this condition does occur
return 0
}
} // Line 19
return f(1, 1)
}
所以這些場景是函數允許的。您可能會在輸入此函數之前驗證這些值,但問題是此函數不執行任何操作,并且傳遞這些值是有效的。
如果你有信心 0,0; 0,1; 并且 1,0 不會是輸入值,您可以else if h < width {通過 else 來避免最后一個;但是這會改變函數的邏輯。同樣,鑒于函數 Paths 已導出,您可能應該對傳入的值進行驗證,如果您需要確保 0,0; 0,1; 和 1;0 選項是不允許的。
如果它符合您的目的,您可以在函數末尾有一個 return ,用于返回 0 或 -1 以指示該值不正確。就個人而言,如果這些值在函數中不可接受,最好驗證輸入并返回錯誤,或者如果必須,請恐慌。
func Paths(m int, n int) int {
length := m
width := n
var f func(int, int) int
f = func(h int, v int) int {
if h == length && v == width {
return 1
} else if h < width && v < width {
return f(h, v+1) + f(h+1, v)
} else if v < length {
return f(h, v+1)
} else if h < width {
return f(h+1, v)
}
return 0
}
return f(1, 1)
}
- 2 回答
- 0 關注
- 176 瀏覽
添加回答
舉報