登录
首页 >  Golang >  Go问答

Go 语言中实现双向映射的方法

来源:stackoverflow

时间:2024-02-26 21:09:26 214浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《Go 语言中实现双向映射的方法》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我正在编写一个简单的控制台游戏,并希望将玩家映射到符号。对于两名玩家,我的方法如下:

func playerToString(p player) string {
    if p == 0 {
        return "X"
    }
    return "O"
}

func stringToPlayer(s string) player {
    if s == "X" {
        return 0
    }
    return 1
}

当然,您也可以将其写为将 int 映射到 string 以及将 string 映射到 int 的两个映射。上述方法和地图方法似乎都容易出错。有没有更惯用的方式在 go 中编写这个?也许某种非 iota 枚举方式?


正确答案


[我假设您的示例只是最小的,并且您的实际映射有两个以上的选项。我还假设你的意思是双向映射]

我会写一张地图:

var player2string = map[int]string{
  0: "0",
  1: "x",
  // etc...
}

然后创建一个函数以编程方式填充不同的地图 string2player。像这样的事情:

var player2string = map[int]string{
    0: "0",
    1: "x",
    // etc...
}

var string2player map[string]int = convertmap(player2string)

func convertmap(m map[int]string) map[string]int {
    inv := make(map[string]int)
    for k, v := range m {
        inv[v] = k
    }
    return inv

}

func main() {
    fmt.println(player2string)
    fmt.println(string2player)
}

Try it on the Go playground

除了 eli 的答案之外,您还可以进行另外两项更改。您可以将 to-symbol 函数设为 player 类型的方法。而且由于玩家值是整数(从零开始连续),因此您可以使用切片而不是映射来存储整数到符号的映射 - 它的存储和查找效率更高一些。

type player int

var playerSymbols = []string{"X", "O", "A", "B", "C", "D", "E", "F", "G", "H"}

func (p player) Symbol() string {
    if int(p) < 0 || int(p) >= len(playerSymbols) {
        return "?" // or panic?
    }
    return playerSymbols[p]
}

此方法签名甚至可以是 string() string,因此它是 fmt.Stringer,这对于打印内容和调试非常有用。

今天关于《Go 语言中实现双向映射的方法》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>