2014-09-30 27 views
14

我有以下函數從終端接收命令並根據輸入打印某些內容。看起來很簡單,如果用戶輸入'add',系統將打印一行,如果用戶輸入任何內容,則輸出其他內容。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

的檢查現有索引這是一種例外,你會遇到你的一生!經過100多年的時間,你會發現它的第六感。 – mihai 2014-09-30 17:41:39

回答

12

如果用戶沒有提供任何輸入,則inp數組爲空。這意味着即使索引0超出範圍,即無法訪問inp[0]

在檢查inp[0] == "add"之前,您可以檢查inp的長度和len(inp)。像這樣的東西可能會做:

if len(inp) == 0 { 
    fmt.Println("you didn't type add") 
} else if inp[0] == "add" { 
    fmt.Println("you typed add") 
} 
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 

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

這是一個可怕的可怕建議,請永遠不要這樣做。 – OneOfOne 2014-09-30 23:10:52

+0

@OneOfOne你能解釋爲什麼它不好嗎? – 2016-07-03 18:42:18

+1

@PieceDigital 1.它很貴,很慢。 2.它鼓勵不應該使用的非常糟糕的編程習慣,你可以很容易地檢查'如果我 OneOfOne 2016-07-04 01:35:32