Dictionary 结构作为Go映射中的键

Dictionary 结构作为Go映射中的键,dictionary,go,data-structures,Dictionary,Go,Data Structures,我正在研究在golang maps中使用结构作为键。这个结构中的一个字段也应该是一个映射,这似乎与提供的文档不符,文档中说只有那些具有可以与==和进行比较的字段的结构=可以位于用作映射中键的结构的字段中。然而,我继续尝试以下方法: package main import "fmt" import "strings" func main() { fmt.Println("Hello, 世界") fmt.Println(strings.Join([]string{"obi", "

我正在研究在golang maps中使用结构作为键。这个结构中的一个字段也应该是一个映射,这似乎与提供的文档不符,文档中说只有那些具有可以与
==
进行比较的字段的结构=可以位于用作映射中键的结构的字段中。然而,我继续尝试以下方法:

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

这似乎与文档不符,因为结构中用作键的字段是映射。我似乎弄错了什么?

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

只有可比较的类型可以用作键(=,!=)。
如果结构(不是指针)只包含可比较的类型,则它是可比较的。

问题,在某些情况下,将映射的键设置为x类型的指针是否合理?当然,当您对对象的标识比对其内容的相等性更感兴趣时。例如,您可以在web服务器中以map[*http.request]字符串或其他形式存储一些额外的每个请求数据。