2013-08-20 17 views
54

Sono nuovo per il golang. Sto cercando di dichiarare di essere costante. Ma sta generando un errore. Qualcuno potrebbe per favore aiutarmi con la sintassi di dichiarare una costante in partenza?Come dichiarare la mappa costante in golang

Questo è il mio codice:

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", 
} 

Questo è l'errore

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

risposta

70

la sintassi non è corretta. Per fare una mappa letterale (come pseudo-costante), si può fare:

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", 
} 

All'interno di un func è possibile dichiarare le cose come:

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

E in Go non v'è alcuna cosa come un mappa costante Maggiori informazioni possono essere trovate here.

Try it out on the Go playground.

+1

Questo getta una dichiarazione 'mancata dichiarazione di fuori funzione body' al momento della compilazione in realtà. Come mai? – alediaferia

+0

@AlessandroDiaferia Non ho ricevuto un errore del genere. Come stai usando? – squiguy

+0

Prova a incollarlo su http://tour.golang.org/#1 – alediaferia

5

Si può emulare una mappa con una chiusura:

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

Try it on the Go playground

+4

(TestMostSoldRecommender?) – twotwotwo

+1

È in effetti una possibile soluzione. Tuttavia, poiché l'autore non ha spiegato nulla (e ha inserito tutto all'interno di un caso di prova con nomi strani), la risposta sembra errata. La logica è: (1) Creare una funzione anonima (2) La funzione anonima incapsula la 'map' (3) La funzione anonima restituisce" una funzione che accetta un int e restituisce una stringa "(4) La funzione restituita fa l'int -> mapping delle stringhe usando 'map' (5) Esegui immediatamente la funzione anonima e assegna la funzione restituita a una variabile. Questa variabile può essere usata come una funzione e l'effetto è come una mappa. –

14

È possibile creare costanti in molti modi diversi:

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

è anche possibile creare una costante enum:

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

Non è possibile creare le costanti di mappe, matrici ed è scritto in effective go:

Costanti a Go sono proprio questo costante. Vengono creati al momento della compilazione , anche se definiti come locali nelle funzioni e possono essere solo numeri , caratteri (rune), stringhe o booleani. A causa della limitazione in fase di compilazione , le espressioni che li definiscono devono essere espressioni costanti , valutabili dal compilatore. Ad esempio, 1 < è un'espressione costante, mentre math.Sin (math.Pi/4) non è perché la chiamata di alla matematica.Sin deve avvenire in fase di esecuzione.

+0

quindi è più simile a un constexpr C++ 11 ... perché math.Sin non è una funzione di constexpr, quindi! –

+0

Le tue affermazioni sono corrette, ma la domanda riguardava la creazione di una mappa costante. – jzer7

+1

@ jzer7 mi puoi spiegare perché la mia risposta è irrilevante? Ha chiesto come creare qualcosa, gli ho detto che questo non è possibile. Spiegato cosa è possibile e ha dato una citazione dai doc perché proprio non è possibile fare ciò che vuole. –

-1

Come detto sopra per definire una mappa come costante non è possibile. Ma puoi dichiarare una variabile globale che è una struttura che contiene una mappa.

L'inizializzazione sarebbe simile a questa:

var romanNumeralDict = struct { 
    m map[int]string 
}{m: map[int]string { 
    1000: "M", 
    900: "CM", 
    //YOUR VALUES HERE 
}} 

func main() { 
    d := 1000 
    fmt.Printf("Value of Key (%d): %s", d, romanNumeralDict.m[1000]) 
} 
+1

Perché non solo rendere la mappa la variabile globale? Perché avvolgerlo nella struttura? –

+0

Questo non rende la mappa costante, puoi ancora fare 'romanNumeralDict.m [1000] =" Nuovo valore "' – brando

0

E come suggerito in precedenza dal Siu Ching Pong -Asuka Kenji con la funzione che a mio parere ha più senso e ti lascia con la comodità del tipo di mappa senza la funzione wrapper:

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

Try this at play.golang.org.

Problemi correlati