为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Go中定义集合映射?

如何在Go中定义集合映射?

Go
潇湘沐 2022-09-12 16:58:35
我想知道如何在Go中定义集合映射。集合是无序唯一元素的集合。这些集合是结构(磁贴)的集合。映射的键是一个字符串。关键是瓷砖的组合。X + “,” + 磁贴。到目前为止,我所拥有的。它只适用于一个元素,而不适用于一个集合。type Tile struct {    X int    Y int}func (t Tile) GetKey() {    return strconv.Itoa(t.X) + "," + strconv.Itoa(t.Y)}// This only works for one element, not for a set.type Cache map[string]Tile
查看完整描述

1 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

如何表示集合

Go 中的集合通常用从给定类型到定义其存在的基元值的映射来表示。类型是语义上表示唯一元素的无序集合的方式。map

var tileSet map[Tile]bool

请注意,您可以使用非指针结构作为映射键。因为:Tile

如果结构值的所有字段都具有可比性,则这些值是可比较的。如果两个结构值对应的非空白字段相等,则两个结构值相等。

...显然这两个领域是可比的。intXY

这是您使用此类地图的方式:

tileSet = make(map[Tile]bool, 0)


tile := Tile{X:1,Y:2}

tileSet[tile] = true


// check existence

if exists := tileSet[tile]; exists {

   // ... 

}


// range over set elements

for tile, _ := range tileSet {

   // ...

}

如何表示集合的映射


微不足道的是:


var tileSetMap map[string]map[Tile]bool


为了简化代码,您还可以定义自己的集合类型:


type TileSet map[Tile]bool


然后


func main() {

    var tileSetMap map[string]TileSet


    // you initialize it normally with make

    tileSetMap = make(map[string]TileSet, 0)

    tileSetMap["foo"] = make(TileSet, 0)


    tile := Tile{10, 20}

    tileSetMap["foo"][tile] = true

    

    fmt.Println(tileSetMap) // map[foo:map[{10 20}:true]]

}

游乐场: https://play.golang.org/p/ObUo62SI3ih


[1] 规格:地图类型


必须为键类型的操作数完全定义比较运算符 == 和 !=


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信