Maison  >  Article  >  développement back-end  >  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
PHPzavant
2024-02-08 21:57:301110parcourir

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

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

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer