2014-12-02 1 views
7

Possiamo facilmente farlo con le mappe:Come verificare se una sezione ha un determinato indice in Go?

item, ok := myMap["index"] 

ma non con le fette:

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

Sorpreso questo non è stato chiesto prima. Forse sono sul modello mentale sbagliato con Go slices?

+5

perché così tanti downvoters? Non puoi più fare domande senza che qualcuno si senta infelice qui. – marcio

+2

Non riesco a capire perché. Non è irragionevole pensare che le mappe e le sezioni funzionino allo stesso modo, proprio come std :: map e std :: vector hanno un'interfaccia simile in C++. –

+3

I (erroneamente) ho ipotizzato che le slice di Go fossero fondamentalmente mappe con chiavi int consecutive. Un rapido sguardo sulla sintassi può farti adottare questo modello mentale, BTW. Ancora non capisco perché il desiderio di downvotare una domanda a causa di ciò, però. Mi chiedo se la comunità di Go venga invasa da studenti di CI aggressivi passivi o qualcosa del genere LOL – marcio

risposta

10

Non c'è fette sparse in Go, quindi si può semplicemente verificare la lunghezza:

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

Se la lunghezza è maggiore di 3, si sa che l'indice 3 e tutti quelli prima che esistano.

+0

Quindi, per sapere se posso ottenere 'mySlice [3]' la sezione deve avere l'indice 4? Quello è strano.Cosa succede se l'indice 3 è l'ultimo? – marcio

+5

Gli indici iniziano da 0, quindi è necessario un valore di 4 se si desidera qualcosa nell'indice 3. –

+1

Va bene, sembra di aver capito Go slice errato. Ho pensato che fosse fondamentalmente una mappa con chiavi int consecutive. Un rapido sguardo sulla sintassi può farti adottare questo modello mentale :) – marcio

0

L'utilizzo dell'istruzione if è qualcosa che non mi piace perché rende più difficile leggere il codice sorgente, un modo più elegante è usare switch/case. Switch/caso è in Go molto multi-funzionali, così dopo aver letto tutte le risposte a questo post, mi si avvicinò con la seguente soluzione:

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

uscita:

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

non è esattamente lo stesso come il tuo problema, ma questo solo per darti un'idea su come aggirarlo.

+0

questa risposta è sulla domanda sbagliata? xD – marcio