Как объявить постоянную карту в 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 {
Ответы
Ответ 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])
}