32

我需要一些关于在 Go 中创建全局地图变量的帮助。我所做的如下:

package ...
import(
...
)
...
type ir_table struct{
    symbol      string
    value       string
}
var ir_MAP map[int]ir_table

由于我没有初始化地图,因此我收到了一个 nil 指针取消引用错误。我必须怎么做才能全局使用这个变量?或者,如果这不是正确的方法,请指导我。

4

4 回答 4

45

您需要使用空地图对其进行初始化:

var ir_MAP = map[int]ir_table{}

或者,正如“系统”所建议的那样:

var ir_MAP = make(map[int]ir_table)

问题是地图的零值是 nil,您不能将项目添加到 nil 地图。

于 2013-03-02T19:12:20.063 回答
11

您可以像这样直接初始化地图:

var Romans = map[byte]int{
    'I': 1,
    'V': 5,
    'X': 10,
    'L': 50,
    'C': 100,
    'D': 500,
    'M': 1000,
}
于 2020-09-16T11:33:52.387 回答
9

你几乎是对的。你只是还没有初始化你的地图。

这是The Playground中的工作代码。

package main

import "fmt"

type ir_table struct{
    symbol      string
    value       string
}
// define global map; initialize as empty with the trailing {}
var ir_MAP = map[int]ir_table{}

func main() {
    ir_MAP[1] = ir_table{symbol:"x", value:"y"}
    TestGlobal()
}

func TestGlobal() {
    fmt.Printf("1 -> %v\n", ir_MAP[1])
}
于 2013-03-02T19:38:26.427 回答
8

老话题,但没有提到最优雅的解决方案。这在无法在主函数中赋值的模块中非常有用。init 只执行一次,因此每次必须初始化映射时它都会节省一些 CPU 周期。

https://play.golang.org/p/XgC-SrV3Wig

package main

import (
    "fmt"
)

var (
    globalMap = make(map[string]string)
)

func init() {
    globalMap["foo"] = "bar"
    globalMap["good"] = "stuff"
}

func main() {
    fmt.Printf("globalMap:%#+v", globalMap)
}
于 2019-12-20T14:29:37.610 回答