상수 맵 선언 방법
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 {
구문이 올바르지 않습니다. 리터럴 맵 (의사 상수로)을 만들려면 다음을 수행 할 수 있습니다.
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에는 상수 맵과 같은 것이 없습니다. 자세한 내용은 여기 에서 확인할 수 있습니다 .
여러 가지 방법으로 상수를 만들 수 있습니다.
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로 작성됩니다 .
Constants in Go are just that—constant. They are created at compile time, even when defined as locals in functions, and can only be numbers, characters (runes), strings or booleans. Because of the compile-time restriction, the expressions that define them must be constant expressions, evaluatable by the compiler. For instance, 1<<3 is a constant expression, while math.Sin(math.Pi/4) is not because the function call to math.Sin needs to happen at run time.
You may emulate a map with a closure:
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))
}
And as suggested above by Siu Ching Pong -Asuka Kenji with the function which in my opinion makes more sense and leaves you with the convenience of the map type without the function wrapper around:
// 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)
}
As stated above to define a map as constant is not possible. But you can declare a global variable which is a struct that contains a map.
The Initialization would look like this:
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])
}
참고URL : https://stackoverflow.com/questions/18342195/how-to-declare-constant-map
'program tip' 카테고리의 다른 글
Jenkins에서 NUnit 테스트를 어떻게 실행합니까? (0) | 2020.08.12 |
---|---|
@Service 주석은 어디에 보관해야합니까? (0) | 2020.08.12 |
tfs 2008에서 다른 지점으로 보류를 해제 할 수 있습니까? (0) | 2020.08.12 |
테이블을 잠그지 않고 ALTER TABLE? (0) | 2020.08.12 |
테스트 실행 폴더에 MSTest 복사 파일 (0) | 2020.08.12 |