2014-12-02 92 views
7

我們可以很容易地做到這一點與地圖:如何檢查切片是否在Go中有指定的索引?

item, ok := myMap["index"] 

但不能與片:

item, ok := mySlice[3] // panic! 

驚訝這是沒有問過。也許我在用Go切片時錯誤的心理模型?

+5

爲什麼這麼多downvoters?如果沒有人在這裏不開心,你不能再提出任何問題。 – marcio 2014-12-02 14:53:15

+2

我看不出爲什麼。認爲地圖和切片的工作原理是一樣的,就像std :: map和std :: vector在C++中有類似的接口一樣,這並不是不合理的。 – 2014-12-02 15:00:10

+3

我(錯誤地)假設Go切片基本上是連續int鍵的映射。快速瀏覽語法可以使你採用這種心理模型,BTW。 儘管如此,仍然沒有得到爲什麼渴望降低問題的原因。讓我想知道Go社區是被被動的攻擊性CI學生入侵或者其他什麼東西LOL – marcio 2014-12-02 15:06:41

回答

10

有在Go無疏片,所以你可以簡單地檢查長度:

if len(mySlice) > 3 { 
    // ... 
} 

如果長度大於3,你知道,該指數3和所有那些之前就已存在。

+0

所以要知道我是否可以得到'mySlice [3]'切片需要索引4?這很奇怪。如果索引3是最後一個呢? – marcio 2014-12-02 14:54:48

+5

索引從0開始,所以如果你想要索引3處的東西,你需要4的長度。 – 2014-12-02 14:58:19

+1

好吧,看來我明白了Go切片錯了。我認爲它基本上是一個連續的int鍵映射。快速查看語法可以使你採用這種思維模式:) – marcio 2014-12-02 15:03:37

0

if語句的用法是我不喜歡的,因爲它讓閱讀源代碼變得更困難,更優雅的方式是使用switch/case。開關/案例是走得非常多的功能,所以閱讀所有的答案在這個崗位後,我用以下解決方案上來:

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() 
} 

輸出:

<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> 

這是不完全一樣的作爲你的問題,但這只是給你一個想法如何解決它。

+0

對這個問題有錯誤嗎?的xD – marcio 2014-12-21 23:31:48

相關問題