web-dev-qa-db-fra.com

Comment déclarer une carte constante

J'essaie de déclarer constant dans Go, mais cela jette une erreur. Est-ce que quelqu'un pourrait m'aider s'il vous plaît avec la syntaxe de déclarer une constante dans Go?

Ceci est mon code:

const romanNumeralDict map[int]string = {
  1000: "M",
  900 : "CM",
  500 : "D",
  400 : "CD",
  100 : "C",
  90  : "XC",
  50  : "L",
  40  : "XL",
  10  : "X",
  9   : "IX",
  5   : "V",
  4   : "IV",
  1   : "I",
}

C'est l'erreur

# command-line-arguments
./Roman_Numerals.go:9: syntax error: unexpected {
102
samol

Votre syntaxe est incorrecte. Pour créer une carte littérale (en tant que pseudo-constante), vous pouvez faire:

var romanNumeralDict = map[int]string{
  1000: "M",
  900 : "CM",
  500 : "D",
  400 : "CD",
  100 : "C",
  90  : "XC",
  50  : "L",
  40  : "XL",
  10  : "X",
  9   : "IX",
  5   : "V",
  4   : "IV",
  1   : "I",
}

Dans un func, vous pouvez le déclarer comme:

romanNumeralDict := map[int]string{
...

Et dans Go, il n’existe pas de carte constante. Plus d'informations peuvent être trouvées ici .

Essayez-le sur le terrain de jeu.

129
squiguy

Vous pouvez créer des constantes de différentes manières:

const myString = "hello"
const pi = 3.14 // untyped constant
const life int = 42 // typed constant (can use only with ints)

Vous pouvez également créer une constante enum:

const ( 
   First = 1
   Second = 2
   Third = 4
)

Vous ne pouvez pas créer de constantes de cartes, de tableaux et il est écrit en go effectif :

Les constantes dans Go ne sont que cela - constantes. Ils sont créés au moment de la compilation, même lorsqu'ils sont définis en tant que locales dans des fonctions, et ne peuvent être que des nombres, des caractères (runes), des chaînes ou des booléens. En raison de la restriction liée à la compilation, les expressions qui les définissent doivent être des expressions constantes, évaluables par le compilateur. Par exemple, 1 << 3 est une expression constante, alors que math.Sin (math.Pi/4) ne l'est pas, car l'appel de la fonction à math.Sin doit avoir lieu au moment de l'exécution.

20
Salvador Dali

Vous pouvez émuler une carte avec une fermeture:

package main

import (
    "fmt"
)

// http://stackoverflow.com/a/27457144/10278

func romanNumeralDict() func(int) string {
    // innerMap is captured in the closure returned below
    innerMap := map[int]string{
        1000: "M",
        900:  "CM",
        500:  "D",
        400:  "CD",
        100:  "C",
        90:   "XC",
        50:   "L",
        40:   "XL",
        10:   "X",
        9:    "IX",
        5:    "V",
        4:    "IV",
        1:    "I",
    }

    return func(key int) string {
        return innerMap[key]
    }
}

func main() {
    fmt.Println(romanNumeralDict()(10))
    fmt.Println(romanNumeralDict()(100))

    dict := romanNumeralDict()
    fmt.Println(dict(400))
}

essayez-le sur le terrain de je

9
oleber

Et comme suggéré ci-dessus par Siu Ching Pong - Asuka Kenji avec la fonction qui, à mon avis, a plus de sens et vous laisse avec la commodité du type de carte sans la fonction wrapper autour de:

   // romanNumeralDict returns map[int]string dictionary, since the return
       // value is always the same it gives the pseudo-constant output, which
       // can be referred to in the same map-alike fashion.
       var romanNumeralDict = func() map[int]string { return map[int]string {
            1000: "M",
            900:  "CM",
            500:  "D",
            400:  "CD",
            100:  "C",
            90:   "XC",
            50:   "L",
            40:   "XL",
            10:   "X",
            9:    "IX",
            5:    "V",
            4:    "IV",
            1:    "I",
          }
        }

        func printRoman(key int) {
          fmt.Println(romanNumeralDict()[key])
        }

        func printKeyN(key, n int) {
          fmt.Println(strings.Repeat(romanNumeralDict()[key], n))
        }

        func main() {
          printRoman(1000)
          printRoman(50)
          printKeyN(10, 3)
        }

Essayez ceci sur play.golang.org.

2
Denis Volin