我正在研究在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
这似乎违背了文档,因为用作键的结构中的字段是地图。我怎么会出错?
答案 0 :(得分:28)
在您的示例中,map键是指向struct的指针,而不是struct本身。即使指向的项目无法进行比较,也可以比较指针的相等性。此比较不是基于项目的内容,而是基于其内存地址。
答案 1 :(得分:1)
仅可比较类型可以用作键(==,!=)。 如果仅包含可比较的类型,则struct(不是指针)是可比较的。