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
Libérer: 2024-11-26 07:48:11
original
1052 Les gens l'ont consulté

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

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

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

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!

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