panic: ошибка времени выполнения: индекс за пределами диапазона в Go

У меня есть следующая функция, которая берет команду с терминала и печатает что-то на основе ввода. Это кажется достаточно простым, если пользователь набирает "добавить", система печатает строку, если пользователь ничего не печатает, он печатает что-то еще.

Всякий раз, когда пользователь добавляет, он работает. Если пользователь не вводит ничего, что он выбрасывает

panic: ошибка времени выполнения: индекс вне диапазона в 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

    }

Ответ 1

Если пользователь не предоставляет никакого ввода, массив 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")
}

Ответ 2

Сначала вы должны проверить длину 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

}

Ответ 3

Также вы можете использовать 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")
}