我一直在研究使用结构作为golang映射中的键。此结构中的一个字段也应该是一个映射,这似乎与此处提供的文档背道而驰,该文档只说那些具有可与之进行比较的字段==且!=可以在用作映射中键的结构的字段中的结构。但是,我继续尝试以下方法:
==
!=
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
这似乎违反了文档,因为用作键的结构中的字段是映射。我似乎出了什么问题?
在您的示例中,映射键是指向结构的指针,而不是结构本身。即使指针指向的项目无法比较,也可以比较指针的相等性。此比较不是基于项目的内容,而是仅基于其内存地址。