【问题标题】:golang :how do I handle index out of range error?golang:如何处理索引超出范围错误?
【发布时间】:2021-05-26 08:55:54
【问题描述】:

我正在用 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))
    }

}

【问题讨论】:

  • 请向我们展示完整的代码。当前的 sn-p 不能恐慌。
  • 我无法重现此问题。你确定你在这段代码上得到了这个错误吗?
  • 在 Go 和 C 中一样,可执行路径作为参数列表的第一个参数传递。所以你必须检查 len == 1
  • @Warrior 你能详细说明一下吗?
  • 当您运行程序时,os.Args 的最小长度为 1,因为默认情况下第一个位置被可执行(您的程序)路径占用。如果用户插入一个或多个参数,则您有 len(os.Args) > 1 ,因此使用它作为条件来查看是否有其他命令行参数(或 len(os.Args) == 1 在您的情况下)。

标签: go panic


【解决方案1】:

您的问题在于这一行:

if len(os.Args) == 0

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

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

【讨论】:

    【解决方案2】:

    另一个答案有几个问题。它有这个检查:

    len(os.Args) <= 1
    

    len(os.Args) 必须始终至少为1,因此使用&lt;= 毫无意义。 此外,在这种特定情况下,len 以外的任何 2 都无效,因为 出色地。所以只需检查一下:

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-24
      • 2022-01-22
      • 1970-01-01
      • 2012-06-19
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      相关资源
      最近更新 更多