Próbuję wygenerować mapę, a następnie przekonwertować ją na plik yaml w następujący sposób:
uid :
kasi:
cn: Chaithra
street: fkmp
nandan:
cn: Chaithra
street: fkmp
remya:
cn: Chaithra
street: fkmp
Myślę, że podczas tworzenia mapy brakuje mi czegoś ważnego. Mój kod jest poniżej.
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)
}
Daje następujący błąd:
panic: runtime error: assignment to entry in nil map
Odpowiedzi:
Nie zainicjowałeś swojej mapy wewnętrznej. Przed pętlą for możesz dodać,
m["uid"] = make(map[string]T)
a następnie przypisać nazwę.źródło
Powinieneś sprawdzić, czy mapa jest zerowa i zainicjować jedną, jeśli jest zerowa w pętli for:
źródło
Jest coś jak na błąd
W przypadku map zagnieżdżonych, gdy przypisujemy je do klucza głębokiego poziomu, musimy mieć pewność, że jego klucz zewnętrzny ma wartość. W przeciwnym razie powie, że mapa jest zerowa. Na przykład w Twoim przypadku
m to zagnieżdżona mapa, która zawiera
string
klucz zmap[string]T
wartością. I przypisujesz wartośćtutaj widać
m["uid"]
isnil
i stwierdzamy, że zawiera wartość,[name]
która jest kluczem do zagnieżdżonej wartości typuT
. Więc najpierw musisz przypisać wartość do „uid” lub zainicjalizować ją jakoźródło
@Makpoc już odpowiedział na pytanie. po prostu dodając dodatkowe informacje.
źródło