128 votes

Les cartes sont-elles passées par valeur ou par référence dans Go?

Les cartes sont-elles passées par valeur ou référence dans Go?

Il est toujours possible de définir une fonction comme suit, mais est-ce excessif?

 func foo(dat *map[string]interface{}) {...}
 

Même question pour la valeur de retour. Dois-je renvoyer un pointeur sur la carte ou la retourner en tant que valeur?

L'intention est bien sûr d'éviter une copie inutile des données.

106voto

Boris Le Méec Points 672

Dans ce fil, vous trouverez votre réponse :

Golang: l'Accès à une carte à l'aide de sa référence

Vous n'avez pas besoin d'utiliser un pointeur avec une carte.

Types de carte sont des types référence, comme des pointeurs ou des tranches[1]

Si vous avez besoin de changer de Session, vous pouvez utiliser un pointeur:

map[string]*Session

https://blog.golang.org/go-maps-in-action

29voto

Akavall Points 7357

Voici quelques pièces de Si une carte n'est pas une variable de référence, c'est quoi? par Dave Chaney:

Une carte de valeur est un pointeur à un moment de l'exécution.hmap structure.

et la conclusion:

Conclusion

Les cartes, comme des canaux, mais contrairement aux tranches, sont juste des pointeurs vers d'exécution les types. Comme vous l'avez vu ci-dessus, une carte est un pointeur à un moment de l'exécution.hmap structure.

Les cartes ont le même pointeur de la sémantique que de toute autre valeur du pointeur dans un Programme de Go. Il n'y a pas de magie enregistrer la réécriture de la carte de la syntaxe par l' compilateur dans les appels à des fonctions d'exécution/hmap.aller.

Et un morceau intéressant à propos de l'histoire, des explications, des map syntaxe:

Si les cartes sont des pointeurs, ne devraient-ils pas être *carte[key]valeur?

C'est une bonne question que, si les cartes sont des valeurs de pointeur, pourquoi ne l' l'expression faire(carte[int]int) retourne une valeur du type carte[int]int. Ne devrait-il pas renvoyer une *carte[int]int? Ian Taylor a répondu récemment dans un golang-noix thread1.

Dans les tout premiers jours de ce que nous appelons les tables ont été écrits comme des pointeurs, si vous avez écrit *carte[int]int. Nous avons déménagé loin de que, lorsque nous avons réalisé que personne n'a jamais écrit map sans écrire *map.

Sans doute renommer le type de *carte[int]int carte[int]int, alors que confusion, car l' le type ne ressemble pas à un pointeur, a moins de confusion que d'un pointeur en forme de valeur qui ne peut être déréférencé.

7voto

Pas de Cartes de référence sont par défaut.

    package main

    import "fmt"

    func mapToAnotherFunction(m map[string]int) {
        m["hello"] = 3
        m["world"] = 4
        m["new_word"] = 5
    }

    // func mapToAnotherFunctionAsRef(m *map[string]int) {
    // m["hello"] = 30
    // m["world"] = 40
    // m["2ndFunction"] = 5
    // }

    func main() {
        m := make(map[string]int)
        m["hello"] = 1
        m["world"] = 2

        // Initial State
        for key, val := range m {
            fmt.Println(key, "=>", val)
        }

        fmt.Println("-----------------------")

        mapToAnotherFunction(m)
        // After Passing to the function as a pointer
        for key, val := range m {
            fmt.Println(key, "=>", val)
        }

        // Try Un Commenting This Line
        fmt.Println("-----------------------")

        // mapToAnotherFunctionAsRef(&m)
        // // After Passing to the function as a pointer
        // for key, val := range m {
        //  fmt.Println(key, "=>", val)
        // }

        // Outputs
        // prog.go:12:4: invalid operation: m["hello"] (type *map[string]int does not support indexing)
        // prog.go:13:4: invalid operation: m["world"] (type *map[string]int does not support indexing)
        // prog.go:14:4: invalid operation: m["2ndFunction"] (type *map[string]int does not support indexing)

    }

De Golang Blog-

Types de carte sont des types référence, comme des pointeurs ou des tranches, et donc la valeur de m au-dessus du néant; il ne pointe pas vers une initialisé la carte. Un néant de la carte se comporte comme une carte vide lors de la lecture, mais tente d'écrire dans un néant carte de provoquer une exécution de panique; ne pas le faire. Pour initialiser une carte, utiliser le construit en faire de la fonction:

m = make(map[string]int)

Extrait de Code Lien Jouer avec elle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X