2013-08-20 15 views
54

Ich bin neu im Golang. Ich versuche zu erklären, konstant zu gehen. Aber es wirft einen Fehler auf. Könnte mir bitte jemand mit der Syntax helfen, eine Konstante in go zu deklarieren?Wie man konstante Karte in Golang erklärt

Dies ist mein 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", 
} 

Dies ist der Fehler

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

Antwort

70

Ihre Syntax ist falsch. Um eine wörtliche Karte zu machen (als pseudo-Konstante), können Sie tun:

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

Innerhalb eines func können Sie erklären es mögen:

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

Und in Go gibt es nicht so etwas wie ein konstante Karte. Weitere Informationen finden Sie unter here.

Try it out on the Go playground.

+1

Dies wirft eine 'nicht-Erklärung Erklärung außerhalb tatsächlich Funktion body' bei der Kompilierung. Woher? – alediaferia

+0

@AlessandroDiaferia Ich bekomme keinen solchen Fehler. Wie benutzt du es? – squiguy

+0

Versuchen Sie es einfügen http://tour.golang.org/#1 – alediaferia

5

Sie mit einem Verschluss Karte emulieren kann:

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

Es ist in der Tat eine mögliche Lösung. Da der Autor jedoch nichts erklärt (und alles in einen seltsam benannten Testfall gebracht hat), sieht die Antwort falsch aus. Die Logik ist: (1) Erstellen Sie eine anonyme Funktion (2) Die anonyme Funktion kapselt die 'map' (3) Die anonyme Funktion gibt" eine Funktion zurück, die ein int akzeptiert und eine Zeichenfolge zurückgibt " -> string mapping mit 'map' (5) Führen Sie die anonyme Funktion sofort aus und weisen Sie die zurückgegebene Funktion einer Variablen zu. Diese Variable kann wie eine Funktion verwendet werden, und der Effekt ist wie eine Karte. –

14

Sie Konstanten auf viele verschiedene Arten erstellen:

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

Sie auch erstellen eine Enum-Konstante:

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

Sie können keine Konstanten von Karten, Arrays erstellen und es wird in effective go geschrieben:

Konstanten in Go ist nur, dass-Konstante. Sie werden beim Kompilieren Mal erstellt, auch wenn sie als Locals in Funktionen definiert sind, und können nur Zahlen, Zeichen (Runen), Strings oder Booleans sein. Aufgrund der Kompilierungszeitbeschränkung müssen die Ausdrücke, die sie definieren, konstante Ausdrücke sein, die vom Compiler ausgewertet werden können. Zum Beispiel ist 1 < ein konstanter Ausdruck, während math.Sin (math.Pi/4) nicht, weil der Funktionsaufruf zu math.Sin zur Laufzeit auftreten muss.

+0

so ist es eher wie ein C++ 11 conexpr ... warum math.Sin ist keine constexpr-Funktion, dann! –

+0

Ihre Aussagen sind korrekt, aber die Frage war, eine Karte zu erstellen, die konstant ist. – jzer7

+1

@ jzer7 Kannst du mir erklären, warum meine Antwort irrelevant ist? Er fragte, wie man etwas schafft, ich sagte ihm, dass das nicht möglich ist. Erklärt was möglich ist und zitierte von den Unterlagen warum genau es nicht möglich ist zu tun was er will. –

-1

Wie oben erwähnt, um eine Karte als Konstante zu definieren, ist nicht möglich. Aber Sie können eine globale Variable deklarieren, die eine Struktur ist, die eine Karte enthält.

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

Warum nicht nur die Karte zur globalen Variable machen? Warum sollte es in die Struktur eingebunden werden? –

+0

Dadurch wird die Map nicht konstant, Sie können immer noch 'romanNumeralDict.m [1000] = "Neuer Wert" ' – brando

0

Und wie oben vorgeschlagen, durch Siu Ching Pong -Asuka Kenji mit der Funktion, die meiner Meinung nach mehr Sinn macht und läßt Dich mit der Bequemlichkeit des Kartentypen ohne die Funktion Wrapper um:

Die Initialisierung würde wie folgt aussehen:

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

Verwandte Themen