Maison >développement back-end >Golang >Comment résoudre l'erreur « Impossible d'attribuer au champ Struct dans la carte » dans Go ?

Comment résoudre l'erreur « Impossible d'attribuer au champ Struct dans la carte » dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-26 07:48:111052parcourir

How to Solve the

Résolution de l'erreur « Impossible d'attribuer un champ de structure dans une carte »

Lors de la tentative de modification d'un champ de structure imbriqué dans une carte dans Go , vous pouvez rencontrer l'erreur « Impossible d'attribuer au champ struct dans la carte ». Cette erreur résulte de la tentative d’attribuer directement une valeur à un champ de structure dans une carte sans faire au préalable une copie de la valeur de la carte. Le problème se pose car les cartes contiennent des références à leurs valeurs, plutôt qu'aux valeurs elles-mêmes.

Comme le montre l'exemple donné, la tentative d'ajout direct d'une nouvelle valeur d'utilisateur provoque l'erreur :

snapshots["test"].Users = append(snapshots["test"].Users, user)

Pour résoudre ce problème, il faut modifier une copie de la valeur de la carte, puis la réattribuer à la carte. Ceci peut être réalisé en suivant les étapes suivantes :

tmp := snapshots["test"].Users
tmp = append(tmp, user)
snapshots["test"].Users = tmp

Cependant, cette approche n'est pas toujours réalisable, en particulier pour les structures complexes ou profondément imbriquées. La solution de contournement recommandée, proposée dans le suivi des problèmes Go, consiste à utiliser le package de contexte.

En encapsulant la carte dans un contexte, vous pouvez facilement modifier un champ de structure sans encourir le message « Impossible d'attribuer au champ de structure dans la carte ». " erreur :

import (
    "context"
    "fmt"
)

func main() {
    ctx := context.TODO()

    snapshots := make(map[string] Snapshot, 1)
    snapshots["test"] = Snapshot {
        Key: "testVal",
        Users: make([]Users, 0),
    }

    user := Users{}

    // Create a new context with the updated value
    ctx, _ = context.WithValues(ctx, "snapshot", snapshots)

    // Retrieve the modified map from the context
    snapshots = ctx.Value("snapshot").(map[string]Snapshot)

    // Append to the Users slice safely
    snapshots["test"].Users = append(snapshots["test"].Users, user)

    fmt.Println(snapshots)
}

Dans cette approche améliorée, les instantanés de la carte sont enveloppés dans le contexte, fournissant un environnement en bac à sable où des modifications peuvent être apportées sans affecter l'original map.

En corrigeant l'erreur « Impossible d'attribuer au champ de structure dans la carte » à l'aide de la solution de contournement recommandée ou du package de contexte, vous pouvez vous assurer que votre code Go manipule les cartes et les structures imbriquées correctement et efficacement.

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