我正在编写一个简单的控制台游戏,并希望将一个玩家Map到一个符号。对于两个玩家,我的方法如下所示:
func playerToString(p player) string {
if p == 0 {
return "X"
}
return "O"
}
func stringToPlayer(s string) player {
if s == "X" {
return 0
}
return 1
}
当然,你也可以把它写成两个Map,一个是int到string,另一个是string到int。上面的方法和map方法看起来都容易出错。在go中有没有更习惯的方法来写这个?也许是一些非iota枚举的方法?
4条答案
按热度按时间but5z9lq1#
我会写一张Map:
然后会创建一个函数来以编程方式填充一个不同的map
string2player
。类似于以下内容:Try it on the Go playground
xu3bshqb2#
除了Eli的答案,你还可以做另外两个改变。你可以把to-symbol函数变成一个
player
类型的方法。因为玩家的值是整数(从零开始连续),你可以用一个切片而不是一个Map来存储int-to-symbolMap--这样存储和查找起来更有效。这个方法签名甚至可以是
String() string
,所以它是一个fmt.Stringer
,这对于打印和调试很有用。a0zr77ik3#
假设你不需要任何特定的Map,玩家整数值的序列为0,1,2,3,...,25,你可以直接生成玩家符号,而不需要使用Map,如下面的片段所示:
cngwdvgl4#
对于任何人,发现这个线程下来,我想一个更符合人体工程学的解决方案,双向值Map,所以我创建了一个小模块来做到这一点。如果有人正在寻找一个现成的解决方案。
https://github.com/graytonio/go-bidirectional-map
编辑:添加了示例代码