Maison >développement back-end >Golang >Pourquoi l'affectation à une carte dans Go entraîne-t-elle une « erreur d'exécution : affectation à une entrée dans une carte nulle » et comment peut-elle être corrigée ?

Pourquoi l'affectation à une carte dans Go entraîne-t-elle une « erreur d'exécution : affectation à une entrée dans une carte nulle » et comment peut-elle être corrigée ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-03 22:27:12203parcourir

Why Does Assigning to a Map in Go Result in a

Erreur d'exécution dans l'attribution de la carte

Question :

Lors de la tentative de conversion d'une carte en un fichier YAML, une erreur est rencontrée indiquant "erreur d'exécution : affectation à l'entrée dans une carte nulle". Consultez l'extrait de code suivant :

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)
}

Quelle est la cause de cette erreur et comment peut-elle être résolue ?

Réponse :

Le problème réside dans l'initialisation de la carte interne dans la carte externe. Dans l'exemple fourni, la carte m["uid"] n'est pas initialisée, ce qui entraîne une carte nulle lorsque vous tentez de lui attribuer le nom.

Pour initialiser la carte interne, ajoutez la ligne suivante avant le for loop :

m["uid"] = make(map[string]T)

Cela crée la carte interne et permet de lui attribuer le nom sans rencontrer d'erreur de carte nulle.

Le code corrigé devient :

func main() {
    names := []string{"kasi", "remya", "nandan"}

    m := make(map[string]map[string]T, len(names))
    m["uid"] = make(map[string]T) // Initialize the inner map

    for _, name := range names {
        m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}
    }
    fmt.Println(m)

    y, _ := yaml.Marshal(&m)

    fmt.Println(string(y))
    //fmt.Println(m, names)
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn