读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更高,起码风格一致
以下操作均以 string 类型为代表
参考GPT和自己的思路:
这个问题其实涉及到了两个方面的考虑:代码的可读性和运行效率。
首先,对于代码的可读性来说,使用switch-case会更加直观清晰,易于理解。相比之下,使用一个大的map可能会让代码变得过于冗长,不便于阅读和理解。尤其是如果这个map非常大的时候,需要进行长时间的滚动浏览才能找到需要的信息。
其次,在运行效率上,虽然map在查找某一个key所对应的value时比较高效,但是在Golang语言中,switch语句会被编译成一张分支表,对于分支较少的情况,其查找的效率其实也是非常高的。
因此,通常情况下,我们会更倾向于在代码编写时考虑可读性,而在运行效率变成瓶颈时再针对性地进行优化。在这个例子中,使用switch-case可能更符合Golang语言的风格,同时也并不会对整个程序的运行效率造成太大的影响。