Maison > développement back-end > Golang > la valeur de la tranche de mise à jour golang n'est pas reflétée dans l'objet conteneur

la valeur de la tranche de mise à jour golang n'est pas reflétée dans l'objet conteneur

PHPz
Libérer: 2024-02-08 21:57:30
avant
1128 Les gens l'ont consulté

la valeur de la tranche de mise à jour golang nest pas reflétée dans lobjet conteneur

L'éditeur php Baicao discutera d'un problème concernant la mise à jour de la valeur d'une tranche dans Golang dans cet article : lorsque nous mettons à jour la valeur dans une tranche, pourquoi la valeur dans l'objet conteneur n'est pas mise à jour en conséquence. Ce problème est souvent rencontré par les développeurs utilisant Golang, nous allons donc en examiner les raisons et proposer des solutions. Que vous soyez débutant ou développeur expérimenté, en lisant cet article, vous pourrez mieux comprendre les opérations de découpage dans Golang.

Contenu des questions

package main

import (
    "fmt"

)

func main() {
    root := map[string]interface{} {
        "disney": "world",  
    }
    fmt.Printf("main begin %v\n", root)
    addList(root)
    fmt.Printf("main after addList %v\n", root)
    addMap(root)
    fmt.Printf("main after addMap  %v\n", root)
}

func addList(root map[string]interface{}) {
    root["list"] = make([]interface{},0,3) 
    mylist := root["list"]
    mylist = append(mylist.([]interface{}),"mickeymouse")
    fmt.Printf("addList %v\n", mylist)
    fmt.Printf("addList %v\n", root)
}

func addMap(root map[string]interface{}) {
    root["map"] = make(map[string]interface{})
    mymap := root["map"]
    mymap.(map[string]interface{})["donald"] = "duck"
    fmt.Printf("addMap %v\n", mymap)
    fmt.Printf("addMap %v\n", root)
}
Copier après la connexion

J'ai une carte racine qui contient la paire "disney" -> "monde". Dans cette carte racine, j'ai ajouté une tranche avec "mickeymouse" dans la fonction addlist, puis j'ai ajouté une carte avec la paire "donald" -> "duck" dans la fonction addmap. Cependant, la tranche n’est pas ajoutée et la carte est ajoutée à la carte racine. Le sous-mapping est un comportement attendu, mais l'ajout de tranches semble être un comportement anormal. Je pense qu'une tranche est une référence, comme une carte en golang. Comment ça se passe ? Cela devrait fonctionner en Java. Où est-ce que je me suis trompé? Comment puis-je le faire fonctionner ? Dans le problème plus important, je n'ai pas d'autre option pour renvoyer autre chose qu'une erreur dans la fonction.

Solution

  • append La fonction renvoie une nouvelle tranche.
  • Le stockage des valeurs dans map ne génère pas de nouvelle carte.

Il est donc naturel que vous ne voyiez pas les nouvelles tuiles, mais vous voyez que le contenu de la carte a été mis à jour.

Comment puis-je le faire fonctionner ?

Stockez la nouvelle tranche à la place de l'ancienne, par ex.

mylist := root["list"]
mylist = append(mylist.([]interface{}),"mickeymouse")
root["list"] = mylist

// or, doing it on one line
root["list"] = append(root["list"].([]any), "mickeymouse")
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:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal