2014-12-02 3 views
7

Мы можем легко сделать с помощью карт:Как проверить, имеет ли срез данный индекс в Go?

item, ok := myMap["index"] 

Но не с кусочками:

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

Удивление это не было предложено раньше. Может быть, я нахожусь на неправильной ментальной модели с ломтиками Go?

+5

Почему так много downvoters? Вы не можете больше задавать вопрос, если кто-то не станет несчастным здесь. – marcio

+2

Я тоже не понимаю, почему. Неразумно думать, что карты и срезы будут работать одинаково, так же как std :: map и std :: vector имеют аналогичный интерфейс на C++. –

+3

I (ошибочно) Предположим, что ломтиками Go были в основном карты с последовательными ключами int. Быстрый взгляд на синтаксис может заставить вас принять эту ментальную модель, BTW. По-прежнему не получается, почему желание уменьшить вопрос из-за этого. Заставляет меня задаться вопросом, запутывается ли сообщество Go пассивными агрессивными студентами CI или чем-то LOL – marcio

ответ

10

Там нет разреженных долек в Go, так что вы могли бы просто проверить длину:

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

Если длина больше, чем 3, вы знаете, что индекс 3 и все тех, кто до этого существует.

+0

Итак, чтобы узнать, могу ли я получить 'mySlice [3]' на срезе должен быть указатель 4? Это странно.Что, если индекс 3 является последним? – marcio

+5

Индексы начинаются с 0, поэтому вам нужна длина 4, если вы хотите что-то в индексе 3. –

+1

Хорошо, кажется, я понял, что Go ломтики ошибочны. Я думал, что это в основном карта с последовательными клавишами int. Быстрый взгляд на синтаксис может заставить вас принять эту ментальную модель :) – marcio

0

Использование инструкции if - это то, что мне не нравится, потому что это делает чтение исходного кода более сложным, более элегантным способом является использование переключателя/футляра. Switch/случай в Go очень многофункциональны, так что после прочтения всех ответов на этот пост, я придумал следующее решение:

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

Смежные вопросы