2017-06-01 4 views
6
func main() { 
    var data = map[string]string{} 
    data["a"] = "x" 
    data["b"] = "x" 
    data["c"] = "x" 
    fmt.Println(data) 
} 

実行中です。ゴランのネストマップ

func main() { 
    var data = map[string][]string{} 
    data["a"] = append(data["a"], "x") 
    data["b"] = append(data["b"], "x") 
    data["c"] = append(data["c"], "x") 
    fmt.Println(data) 
} 

も実行されます。

func main() { 
    var w = map[string]string{} 
    var data = map[string]map[string]string{} 
    w["w"] = "x" 
    data["a"] = w 
    data["b"] = w 
    data["c"] = w 
    fmt.Println(data) 
} 

もう一度実行されます。

func main() { 
    var data = map[string]map[string]string{} 
    data["a"]["w"] = "x" 
    data["b"]["w"] = "x" 
    data["c"]["w"] = "x" 
    fmt.Println(data) 
} 

ただし、失敗します。

Goにネストされたマップに問題はありますか?または、ネストされたマップの複数のブラケットサポートはありませんか?

答えて

7

マップタイプのzero valuenilです。まだ初期化されていません。 nilマップに値を格納することはできません。これはランタイムパニックです。

最後の例では、(外側)dataマップを初期化しますが、エントリはありません。 data["a"]のようにインデックスすると、"a"というキーのエントリがまだ存在しないため、インデックス化すると、値タイプのゼロ値(マップの場合はnil)が返されます。したがって、data["a"]["w"]に割り当てようとすると、ランタイムパニックになります。

var data = map[string]map[string]string{} 

data["a"] = map[string]string{} 
data["b"] = make(map[string]string) 
data["c"] = make(map[string]string) 

data["a"]["w"] = "x" 
data["b"]["w"] = "x" 
data["c"]["w"] = "x" 
fmt.Println(data) 

出力(Go Playground上でそれを試してみてください):

map[a:map[w:x] b:map[w:x] c:map[w:x]] 

注意変数を宣言するとき、あなたが例えば、その中の要素を格納する前に最初のマップを初期化する必要があり

のようにcomposite literalで初期化し、初期化としてカウントします。あなたはまた、複合リテラルを使用して、ネストされたマップを初期化することが

注:

var data = map[string]map[string]string{ 
    "a": map[string]string{}, 
    "b": map[string]string{}, 
    "c": map[string]string{}, 
} 

data["a"]["w"] = "x" 
data["b"]["w"] = "x" 
data["c"]["w"] = "x" 
fmt.Println(data) 

出力は同じです。 Go Playgroundで試してみてください。

+0

私はphpの習慣でgolangをコーディングしていることに気付きました:)完全な型セーフでコーディングするのは難しいです。しかし、私はそれが好きです、あなたの答えをどうもありがとう。 –

+0

マップが繰り返し挿入されている場合は、割り当て前にnil値をチェックすることができます: 'if data [" c "] == nil { \t \t data [" c "] = map [string] string {}} 'これは、マップからのデータの損失を避けるのに役立ちます。 – J0hnG4lt