web-dev-qa-db-fra.com

Comment vérifier si une tranche a un index donné dans Go?

Nous pouvons facilement le faire avec des cartes:

item, ok := myMap["index"]

Mais pas avec des tranches:

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

Surpris, cela n'a pas été demandé auparavant. Peut-être que je suis sur le mauvais modèle mental avec les tranches Go?

29
marcio

Il n'y a pas de tranches clairsemées dans Go, vous pouvez donc simplement vérifier la longueur:

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

Si la longueur est supérieure à 3, vous savez que l'index 3 et tous ceux qui l'ont précédé existent.

24
laurent

L'utilisation d'instructions if est quelque chose que je n'aime pas car cela rend la lecture du code source plus difficile, une manière plus élégante consiste à utiliser switch/case. Switch/case est en Go très multifonctionnel, donc après avoir lu toutes les réponses dans ce post, j'ai trouvé la solution suivante:

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

Production :

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

Ce n'est pas exactement le même que votre problème, mais c'est juste pour vous donner une idée de la façon de le contourner.

0
Dippo