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