繁体   English   中英

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

[英]How to define a map of sets in Go?

我想知道如何在 Go 中定义集合映射。 集合是无序的唯一元素的集合。

这些集合是结构(Tile)的集合。 地图的键是一个字符串。 关键是tile.X + "," + tile.Y的组合。

到目前为止我所拥有的。 它只适用于一个元素,不适用于集合。

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

如何表示一个集合

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

var tileSet map[Tile]bool

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

如果所有字段都具有可比性,则结构值具有可比性。 如果它们对应的非空白字段相等,则两个结构体值相等。

...显然两个int字段XY是可比的。

这就是你如何使用这样的地图:

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] 规格:地图类型

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM