How to check if a slice has a given index in Go?
我们可以通过地图轻松做到这一点:
1 | item, ok := myMap["index"] |
但不是切片:
1 | item, ok := mySlice[3] // panic! |
很惊讶之前没人问这个问题。也许我是在错误的思维模式和去切片?
Go中没有稀疏切片,因此您可以简单地检查长度:
1 2 3 | if len(mySlice) > 3 { // ... } |
如果长度大于3,您就知道索引3和之前的所有索引都存在。
if语句的用法是我不喜欢的,因为它使读取源代码变得更困难,一种更优雅的方法是使用switch/case。switch/case在go中非常多功能,因此在阅读完本文中的所有答案后,我提出了以下解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | package main import ( "fmt" ) func checkarg(data ...string) { for _, value := range data { fmt.Printf("<%v>", value) } fmt.Println() switch len(data) { case 0: fmt.Println("No arguments at all!") fmt.Println("Missing <IP:port>") fallthrough case 1: fmt.Println("Missing <command>") fallthrough case 2: fmt.Println("Missing <key>") fallthrough case 3: fmt.Println("Missing <value>") case 4: fmt.Println("len = 4 (correct)") default: fmt.Println("Unknown length") } } func main() { checkarg("127.0.0.1:6379","set","Foo","Bar","test") fmt.Println() checkarg("127.0.0.1:6379","set","Foo","Bar") fmt.Println() checkarg("127.0.0.1:6379","set","Foo") fmt.Println() checkarg("127.0.0.1:6379","set") fmt.Println() checkarg("127.0.0.1:6379") fmt.Println() checkarg() fmt.Println() } |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <127.0.0.1:6379> <set> <Foo> <Bar> <test> Unknown length <127.0.0.1:6379> <set> <Foo> <Bar> len = 4 (correct) <127.0.0.1:6379> <set> <Foo> Missing <value> <127.0.0.1:6379> <set> Missing <key> Missing <value> <127.0.0.1:6379> Missing <command> Missing <key> Missing <value> No arguments at all! Missing <IP:port> Missing <command> Missing <key> Missing <value> |
这和你的问题不完全一样,但这只是为了给你一个解决问题的方法。