Golang: 如何处理索引越界错误?

9

我正在使用Go编写一个CLI接口程序。我的程序要求用户输入一个文件名作为参数。以下是我编写的处理用户未输入任何参数情况的代码。但是它会抛出一个错误"索引超出范围"。我该如何处理?

  package main

import (
    "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))
    }

}

请展示完整的代码。当前的代码片段不应该出现错误。 - Roland Illig
2
在Go和C中,可执行文件路径作为参数列表的第一个参数传递。因此,您需要检查len == 1。 - Warrior
@Warrior,你能详细说明一下吗? - Prithviraj Sukale
参数始终至少为1个,因为Args [0]将是可执行文件的名称。因此,您的第一个if检查len == 0将失败。 - BlueSpaceCanary
哦,好的。我明白了。谢谢@Warrior。 - Prithviraj Sukale
显示剩余2条评论
2个回答

14

你的问题在这一行:

if len(os.Args) == 0

你正在检查第一个参数,它应该是文件名,但实际上是go /可执行文件名。因此,如果您想检查是否提供了参数,需要检查参数长度是否大于1。更改代码为:

您正在检查的是第一个参数,本应该是文件名,但实际上是Go/可执行文件的文件名。因此,如果您想检查是否提供了参数,需要检查参数长度是否大于1。请将代码更改为:

if len(os.Args) <= 1 {
    log.Fatal("usage: gohex  <filename>")
}

3
另一个答案存在一些问题。它有以下检查:

该代码:

len(os.Args) <= 1

但是len(os.Args)必须至少为1,因此使用<=是无意义的。 另外,在这种特定情况下,除了2以外的任何len都是无效的。所以只需检查:

package main
import "os"

func main() {
   if len(os.Args) != 2 {
      println("gohex <filename>")
      return
   }
   filename := os.Args[1]
   println(filename)
}

顺带一提,个人认为在这种情况下使用os.Exit(1)也是无效的。我认为“打印帮助文本”是一个有效的用例,而不是一个错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接