枚举时,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,就没太明白为啥要这么搞,是有啥我尚未理解的深意吗?