我有以下函数从终端获取命令并根据输入打印内容。这似乎很简单,如果用户键入'添加'系统打印一行,如果用户没有输入任何内容,则会打印其他内容。
每当用户输入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
}
答案 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")
}