我正在用 Go 編寫一個 CLI 接口程序。我的程序需要用戶輸入文件名作為參數。以下是我為處理用戶不輸入任何參數的情況而編寫的代碼。但它會恐慌并給出錯誤“索引超出范圍”。我該如何處理? package mainimport ( "encoding/hex" "fmt" "io/ioutil" "log" "os")func main() { if len(os.Args) == 0 { fmt.Println("usage: gohex <filename>") os.Exit(1) } else { filename := os.Args[1] data, err := ioutil.ReadFile(filename) if err != nil { log.Fatal(err) } fmt.Println(hex.Dump(data)) }}
2 回答

呼啦一陣風
TA貢獻1802條經驗 獲得超6個贊
您的問題取決于這一行:
if len(os.Args) == 0
您正在檢查您認為應該是文件名的第一個參數,但實際上是 go / 可執行文件名。因此,如果您想檢查是否提供了參數,則需要檢查參數長度是否大于1. 將代碼更改為:
if len(os.Args) <= 1 {
log.Fatal("usage: gohex <filename>")
}

神不在的星期二
TA貢獻1963條經驗 獲得超6個贊
另一個答案有幾個問題。它有這個檢查:
len(os.Args) <= 1
但len(os.Args)必須總是至少1,所以使用<=是沒有意義的。此外,在這種特定情況下,len除此之外的任何其他內容2也是無效的。所以只需檢查一下:
package main
import "os"
func main() {
if len(os.Args) != 2 {
println("gohex <filename>")
return
}
filename := os.Args[1]
println(filename)
}
旁注,我個人也認為 usingos.Exit(1)在這種情況下也是無效的。我認為“打印幫助文本”是一個有效的用例,而不是錯誤。
- 2 回答
- 0 關注
- 340 瀏覽
添加回答
舉報
0/150
提交
取消