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로 작성됩니다 .
Go의 상수는 바로 상수입니다. 함수에서 로컬로 정의 된 경우에도 컴파일 타임에 생성되며 숫자, 문자 (룬), 문자열 또는 부울 일 수 있습니다. 컴파일 시간 제한으로 인해이를 정의하는 식은 컴파일러에서 평가할 수있는 상수 식이어야합니다. 예를 들어 1 << 3은 상수 표현식이지만 math.Sin (math.Pi / 4)은 math.Sin에 대한 함수 호출이 런타임에 발생해야하기 때문이 아닙니다.
답변
클로저로 맵을 에뮬레이트 할 수 있습니다.
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))
}
답변
위에서 Siu Ching Pong -Asuka Kenji 가 제안한 것처럼 내 의견으로는 더 이해하기 쉽고 함수 래퍼없이지도 유형의 편리함을 제공하는 기능이 있습니다.
// 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)
}
답변
위에서 언급했듯이 맵을 상수로 정의하는 것은 불가능합니다. 그러나 맵을 포함하는 구조체 인 전역 변수를 선언 할 수 있습니다.
초기화는 다음과 같습니다.
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])
}