在Go地图中将结构作为键

时间:2014-01-11 15:41:29

标签: dictionary go data-structures

我正在研究在golang地图中使用结构作为键。此结构中的字段也应该是一个映射,这似乎违反了提供的文档here,该文档说明只有具有可与==!=进行比较的字段的结构可以在结构的字段中用作地图中的键。然而,我继续尝试以下方法:

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
}

输出结果为:

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

这似乎违背了文档,因为用作键的结构中的字段是地图。我怎么会出错?

2 个答案:

答案 0 :(得分:28)

在您的示例中,map键是指向struct的指针,而不是struct本身。即使指向的项目无法进行比较,也可以比较指针的相等性。此比较不是基于项目的内容,而是基于其内存地址。

答案 1 :(得分:1)

仅可比较类型可以用作键(==,!=)。 如果仅包含可比较的类型,则struct(不是指针)是可比较的。