2014-09-30 23 views
14

Tôi có chức năng sau đây lấy lệnh từ thiết bị đầu cuối và in nội dung nào đó dựa trên đầu vào. Nó có vẻ đơn giản, nếu người dùng gõ 'add' hệ thống in một dòng, nếu người dùng không gõ gì, nó sẽ in ra một thứ khác.hoảng loạn: lỗi thời gian chạy: chỉ mục nằm ngoài phạm vi ở số

Bất cứ khi nào người dùng thêm, nó hoạt động. Nếu người dùng không nhập bất cứ điều gì nó ném

hoảng loạn: lỗi thời gian chạy: chỉ mục nằm ngoài phạm vi trong GoLang

Tại sao điều này?

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

Đây là loại ngoại lệ bạn sẽ gặp phải toàn bộ cuộc sống của bạn! Sau hơn 100 lần, bạn sẽ phát triển ý nghĩa thứ 6 cho nó. – mihai

Trả lời

12

Nếu người dùng không cung cấp bất kỳ đầu vào nào, mảng inp trống. Điều này có nghĩa là ngay cả chỉ mục 0 nằm ngoài phạm vi, nghĩa là không thể truy cập vào inp[0].

Bạn có thể kiểm tra độ dài inp bằng len(inp) trước khi kiểm tra inp[0] == "add". Một cái gì đó như thế này có thể làm:

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

Bạn phải kiểm tra độ dài của inp đầu tiên:

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

Ngoài ra bạn có thể sử dụng recover() để kiểm tra chỉ số hiện tại của lát

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

Đây là một lời khuyên khủng khiếp khủng khiếp, xin đừng bao giờ làm điều đó, bao giờ hết. – OneOfOne

+0

@OneOfOne bạn có thể giải thích tại sao nó xấu không? –

+1

@PieceDigital 1. nó đắt và chậm. 2. nó khuyến khích thực hành lập trình cực kỳ xấu mà không nên được sử dụng, bạn có thể dễ dàng kiểm tra 'if i OneOfOne

Các vấn đề liên quan