golang:我如何处理索引超出范围的错误?

时间:2016-05-12 18:52:29

标签: go panic

我在Go.my程序中编写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))
    }

}

2 个答案:

答案 0 :(得分:9)

你的问题依赖于这一行:

if len(os.Args) == 0

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

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

答案 1 :(得分:0)

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

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)
}

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