web-dev-qa-db-ja.com

グローバルマップ変数を作成する

Goでのグローバルマップ変数の作成に関して少し助けが必要です。私がしたことは次のとおりです:

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

マップを初期化していないため、nilポインター逆参照エラーが発生しています。この変数をグローバルに使用するにはどうすればよいですか?または、これが正しい方法でない場合は、私を案内してください。

24
progfan

空のマップで初期化する必要があります:

var ir_MAP = map[int]ir_table{}

または、「システム」が示唆するように:

var ir_MAP = make(map[int]ir_table)

問題は、マップのゼロ値がnilであり、nilマップにアイテムを追加できないことです。

35
andybalholm

あなたはほとんどそれを正しく持っています。マップをまだ初期化していません。

これが 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])
}
8
Daniel

古いトピックですが、最もエレガントなソリューションは言及されていません。これは、メイン関数で値を割り当てることができないモジュールで非常に役立ちます。 initは1回だけ実行されるため、マップを初期化する必要があるたびに数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)
}
0
Victor Smirnov