一尘不染

在Go地图中将结构作为键

go

我一直在研究使用结构作为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

这似乎违反了文档,因为用作键的结构中的字段是映射。我似乎出了什么问题?


阅读 155

收藏
2020-07-02

共1个答案

一尘不染

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

2020-07-02