web-dev-qa-db-fra.com

Structures comme clés dans les cartes Go

Je cherchais à utiliser des structures comme clés dans les cartes de Golang. Un champ dans cette structure est également censé être une carte et cela semble aller à l'encontre de la documentation fournie ici qui dit que seules les structures qui ont des champs qui peuvent être comparés à == et != peut être dans les champs des structures qui sont utilisées comme clés dans les cartes. Je suis cependant allé de l'avant pour essayer ce qui suit:

package main

import "fmt"
import "strings"

func main() {
    fmt.Println("Hello, 世界")
    fmt.Println(strings.Join([]string{"obi", "$", "56"}, ""))
    z := make(map[string]float64)

    z["obi"] = 0.003

    x := &test{
        name:"testing",
        code:z,
    }

    a := &test{
        name:"testing2",
        code:z,
    }

    y := make(map[*test] string)

    y[x] = "go home"
    y[a] = "come home"

    for key, val := range y{
        fmt.Println(key.name, key.code, val)
    }

}

type test struct{
    name string
    code map[string]float64
}

Le résultat était:

Hello, 世界
obi$56
testing map[obi:0.003] go home
testing2 map[obi:0.003] come home

Cela semble aller à l'encontre de la documentation car un champ dans la structure utilisée comme clé est une carte. Qu'est-ce que je semble me tromper?

20
cobie

Dans votre exemple, la clé de carte est un pointeur vers la structure, pas la structure elle-même. L'égalité des pointeurs peut être comparée même lorsque les éléments vers lesquels ils pointent ne peuvent pas être comparés. Cette comparaison n'est pas basée sur le contenu de l'élément, mais uniquement sur son adresse mémoire.

30
andybalholm

seul un type comparable peut être utilisé comme clé (==,! =). struct (pas un pointeur) est comparable au cas où il ne contient que des types comparables.

0
15412s