2014-09-30 22 views
14

Ho la seguente funzione che accetta un comando dal terminale e stampa qualcosa in base all'input. Sembra abbastanza semplice, se l'utente digita "aggiungi" il sistema stampa una riga, se l'utente non digita nulla, stampa qualcos'altro.: errore di runtime: indice fuori intervallo in Go

Ogni volta che l'utente digita, funziona. Se l'utente non digita nulla getta

panico: errore di runtime: Indice fuori intervallo a GoLang

Perché è questo?

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

Questo è il tipo di eccezione incontrerai tutta la tua vita! Dopo oltre 100 volte, svilupperai un sesto senso per questo. – mihai

risposta

12

Se l'utente non fornisce alcun input, la matrice inp è vuoto. Ciò significa che anche l'indice 0 non è compreso nell'intervallo, ovvero non è possibile accedere a inp[0].

È possibile controllare la lunghezza di inp con len(inp) prima di controllare inp[0] == "add". Qualcosa di simile potrebbe fare:

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

È necessario controllare la lunghezza del inp prima:

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

Inoltre è possibile utilizzare recover() per il controllo esistente indice di fette

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

Questo è un terribile consiglio terribile, per favore non farlo mai, mai. – OneOfOne

+0

@OneOfOne potresti spiegare perché è male? –

+1

@PieceDigital 1. è costoso e lento. 2. incoraggia pratiche di programmazione estremamente scorrette che non dovrebbero essere usate, puoi facilmente controllare 'if i OneOfOne

Problemi correlati