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
Libérer: 2024-12-03 22:27:12
original
199 Les gens l'ont consulté

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)
}
Copier après la connexion

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)
Copier après la connexion

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal