我正在用 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 关注
- 349 浏览
添加回答
举报
0/150
提交
取消