Dans le premier cas je passe une carte par valeur: paquet principalmutation étrange de la carte lorsque la valeur passée vs lorsqu'il est passé par référence (golang)
import (
"fmt"
"time"
)
func timeMap(z map[string]interface{}) {
z["updated_at"] = time.Now()
}
func main() {
foo := map[string]interface{}{
"Matt": 42,
}
timeMap(foo)
fmt.Println(foo)
}
La sortie est une carte en sourdine:
map[updated_at:2009-11-10 23:00:00 +0000 UTC Matt:42]
Dans le second cas le code est presque identique, mais pour le passage par référence:
package main
import (
"fmt"
"time"
)
func timeMap(z *map[string]interface{}) {
(*z)["updated_at"] = time.Now()
}
func main() {
foo := map[string]interface{}{
"Matt": 42,
}
timeMap(&foo)
fmt.Println(foo)
}
De toute évidence, le résultat est différent:
map[Matt:42 updated_at:2009-11-10 23:00:00 +0000 UTC]
Mes attentes étaient les suivantes:
- en passant par la carte de valeur est pas mis en sourdine
- Lors du passage par carte de référence est mis en sourdine comme dans le deuxième cas. Cependant, dans la première carte de cas a été coupé, mais dans l'ordre inverse (par rapport au deuxième cas).
Pourquoi cela arrive-t-il?
1) [Pourquoi une valeur de carte dans une fonction affectée par une entrée à la carte dans une autre fonction?] (Https://stackoverflow.com/questions/39605295/why-is-a-map -value-dans-une-fonction-affectée-par-une-entrée-à-la-carte-dans-autre-fu/39605565 # 39605565); et 2) [Pourquoi ne peut pas aller cartes Iterate afin d'insertion?] (https://stackoverflow.com/questions/28930416/why-cant-go-iterate-maps-in-insertion-order/28931555#28931555) – icza
Go n'a pas la notion de "passage par référence", donc votre question n'a aucun sens. Arrêtez de penser aux pointeurs comme "passer par référence". Ce n'est pas. – Volker