枚举时,code与字符串的转换,不应该是用map对照表来检索效率最高吗?

枚举时,code与字符串的转换,不应该是用map对照表来检索效率最高吗?

读google.golang.org/grpc/codes 源码时发现一个问题。
字符串转枚举时,用的是个map

type Code uint32

const (
    // OK is returned on success.
    OK Code = 0
    Canceled Code = 1
    Unknown Code = 2
    InvalidArgument Code = 3
        //...
)

var strToCode = map[string]Code{
    `"OK"`: OK,
    `"CANCELLED"`:/* [sic] */ Canceled,
    `"UNKNOWN"`:             Unknown,
    `"INVALID_ARGUMENT"`:    InvalidArgument,
        //...
}

但在code转string时,却用了switch-case


func (c Code) String() string {
    switch c {
    case OK:
        return "OK"
    case Canceled:
        return "Canceled"
    case Unknown:
        return "Unknown"
    case InvalidArgument:
        return "InvalidArgument"
        //...
    default:
        return "Code(" + strconv.FormatInt(int64(c), 10) + ")"
    }
}

按说不是map的运行效率最高吗?前半段看得出源码作者也是有这部分追求的,但是后半段又用了相对笨拙的switch-case,就没太明白为啥要这么搞,是有啥我尚未理解的深意吗?

又是GTP的AI回答。
不过先考虑可读性再在瓶颈时优化也是没错的,我自己还是用map了,明明论可读性也是map更高,起码风格一致

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

参考GPT和自己的思路:

这个问题其实涉及到了两个方面的考虑:代码的可读性和运行效率。

首先,对于代码的可读性来说,使用switch-case会更加直观清晰,易于理解。相比之下,使用一个大的map可能会让代码变得过于冗长,不便于阅读和理解。尤其是如果这个map非常大的时候,需要进行长时间的滚动浏览才能找到需要的信息。

其次,在运行效率上,虽然map在查找某一个key所对应的value时比较高效,但是在Golang语言中,switch语句会被编译成一张分支表,对于分支较少的情况,其查找的效率其实也是非常高的。

因此,通常情况下,我们会更倾向于在代码编写时考虑可读性,而在运行效率变成瓶颈时再针对性地进行优化。在这个例子中,使用switch-case可能更符合Golang语言的风格,同时也并不会对整个程序的运行效率造成太大的影响。