私はマップを生成し、それを次のようなyamlファイルに変換しようとしています:
uid :
kasi:
cn: Chaithra
street: fkmp
nandan:
cn: Chaithra
street: fkmp
remya:
cn: Chaithra
street: fkmp
マップの作成中に重要なものが不足していると思います。私のコードは以下です。
package main
import (
"fmt"
"gopkg.in/yaml.v2"
)
type T struct {
cn string
street string
}
func main() {
names := []string{"kasi", "remya", "nandan"}
m := make(map[string]map[string]T, len(names))
for _, name := range names {
//t := T{cn: "Chaithra", street: "fkmp"}
m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}
}
fmt.Println(m)
y, _ := yaml.Marshal(&m)
fmt.Println(string(y))
//fmt.Println(m, names)
}
次のエラーが発生しています。
panic: runtime error: assignment to entry in nil map
内部マップを初期化していません。 forループの前に、m["uid"] = make(map[string]T)
を追加してから名前を割り当てることができます。
マップがnilかどうかを確認し、forループ内でnilの場合は初期化する必要があります。
if m["uid"] == nil {
m["uid"] = map[string]T{}
}
エラーによるものがあります
assignment to entry in nil map
ネストされたマップの場合、深いレベルのキーに割り当てる場合、外側のキーに値があることを確認する必要があります。それ以外の場合、マップはゼロであると表示されます。例えばあなたの場合
m := make(map[string]map[string]T, len(names))
mは、値としてmap[string]T
を持つstring
キーを含むネストされたマップです。そして、あなたは値を割り当てています
m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}
ここでは、m["uid"]
がnil
であり、タイプT
のネストされた値のキーである値[name]
が含まれていることがわかります。そのため、まず「uid」に値を割り当てるか、次のように初期化する必要があります。
m["uid"] = make(map[string]T)