Подтвердить что ты не робот

Как объявить постоянную карту в golang

Я новичок в голанге. Я пытаюсь объявить постоянным в 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 {
4b9b3361

Ответ 1

Ваш синтаксис неверен. Чтобы сделать буквенную карту (как псевдопостоянную), вы можете сделать:

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

Внутри func вы можете объявить его как:

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

И в Go нет такой вещи, как постоянная карта. Более подробную информацию можно найти здесь.

Попробуйте на игровой площадке Go.

Ответ 2

Вы можете создавать константы разными способами:

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 такие же константы. Они создаются при компиляции времени, даже если они определены как локальные функции, и могут быть только числа, символы (руны), строки или булевы. Из-за ограничение времени компиляции, выражения, которые их определяют, должны быть константные выражения, оцениваемые компилятором. Например, 1 < 3 является константным выражением, тогда как math.Sin(math.Pi/4) происходит не потому, что вызов функции math.Sin должен произойти во время выполнения.

Ответ 3

Вы можете эмулировать карту с закрытием:

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

Ответ 4

Как указано выше, определение карты как константы невозможно. Но вы можете объявить глобальную переменную, которая является структурой, содержащей карту.

Инициализация будет выглядеть так:

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