恐慌:运行时错误:Go中的索引超出范围

时间:2014-09-30 17:01:08

标签: go

我有以下函数从终端获取命令并根据输入打印内容。这似乎很简单,如果用户键入'添加'系统打印一行,如果用户没有输入任何内容,则会打印其他内容。

每当用户输入add时,它都有效。如果用户没有输入它抛出的任何内容

恐慌:运行时错误:GoLang中的索引超出范围

这是为什么?

  func bootstrapCmd(c *commander.Command, inp []string) error {


     if inp[0] == "add" {
                  fmt.Println("you typed add")
              } else if inp[0] == "" {
                  fmt.Println("you didn't type add")
              }


          return nil

    }

3 个答案:

答案 0 :(得分:23)

如果用户未提供任何输入,则inp数组为空。这意味着即使索引0超出范围,也无法访问inp[0]

在检查inp之前,您可以使用len(inp)检查inp[0] == "add"的长度。这样的事情可能会这样:

if len(inp) == 0 {
    fmt.Println("you didn't type add")
} else if inp[0] == "add" {
    fmt.Println("you typed add")
}

答案 1 :(得分:5)

您必须首先检查inp的长度:

func bootstrapCmd(c *commander.Command, inp []string) (err error) {
    if len(inp) == 0 {
        return errors.New("no input")
    }
    switch inp[0] {
    case "add":
        fmt.Println("you typed add")
    case "sub":
        fmt.Println("you typed sub")
    default:
        fmt.Println("invalid:", inp[0])
    }
    return nil

}

答案 2 :(得分:-4)

此外,您可以使用recover()来检查切片的现有索引

func takes(s []string, i int) string {
    defer func() {
        if err := recover(); err != nil {
           return
        }
    }()
    return s[i]
}

if takes(inp,0) == "add" {
   fmt.Println("you typed add")
} else {
   fmt.Println("you didn't type add")
}