![](/img/trans.png)
[英]How to do deep sets and gets in Go's map[string]interface{}?
[英]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
字段X
和Y
是可比的。
这就是你如何使用这样的地图:
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.