165

Go で定数を宣言しようとしていますが、エラーがスローされます。Goで定数を宣言する構文を教えてください。

これは私のコードです:

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

これがエラーです

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

5 に答える 5

206

構文が正しくありません。リテラル マップを (疑似定数として) 作成するには、次のようにします。

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

a 内では、次のfuncように宣言できます。

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

Go には定数マップなどというものはありません。詳細については、こちらをご覧ください

Go プレイグラウンドで試してみてください。

于 2013-08-20T18:21:32.573 に答える
30

定数はさまざまな方法で作成できます。

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

列挙型定数を作成することもできます:

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

マップ、配列の定数を作成することはできず、有効な goで記述されています:

Go の定数はまさに定数です。関数でローカルとして定義されている場合でも、コンパイル時に作成され、数値、文字 (ルーン)、文字列、またはブール値のみを使用できます。コンパイル時の制限により、それらを定義する式は、コンパイラによって評価可能な定数式でなければなりません。たとえば、1<<3 は定数式ですが、math.Sin(math.Pi/4) は実行時に関数呼び出しが必要なため、定数式ではありません。

于 2015-04-24T01:42:41.413 に答える
16

クロージャーを使用してマップをエミュレートできます。

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

Go プレイグラウンドで試す

于 2014-12-13T08:55:29.787 に答える