结构体作为 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

这似乎与文档背道而驰,因为用作键的结构中的字段是映射。我似乎有什么问题?


慕后森
浏览 329回答 2
2回答

ABOUTYOU

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

MM们

只有可比较的类型才能用作键 (== ,!=)。如果结构体(不是指针)只包含可比较的类型,则它是可比较的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go