最近给一个项目加上了限速的功能,跑了一段时间后发现一个问题,超级管理员的速度阈值本来是最大的,实际使用是却发现好想是0。
打了个个断点, 发现admin的rate.Limit 确实是 -1000。
看了下代码,原来是overflow了。
q.Speed
的type是 int16
当时写的时候觉得float64
怎么可能overflow, 现在发现 是int16 * 1000
就已经overflow了。
所以类型转换的时候一定要先转换再计算。
update
如果是int64
转 int32
的话,则应该反过来: int32(a / 1000)
其中a是int64
类型。
准确来说,小转大,先转换再计算; 大转小,先计算再转小。