记录一个比较个例的问题,某天API突然写入数据失败,原因是数据库写入长度超出,并且从日志中发现了 "Infinity" 这样的特殊字符串
英语渣渣的我有懵,客户端发过来的数据,API都会转换为对应的数据类型,再进行数据库写入,如果是字符串,最多就转成0,怎么会长度超出
万变不离其宗,肉眼看不出的问题(哈哈 其实就是知识界有限),那就打断点,看看这个字符串究竟被转化成什么
可以看到,“Infinity” 通过 strconv.ParseFloat 转换为 +Inf ,即无穷大
后面通过尝试,发现 Inf,-Inf,Infinity,-Infinity 这些特殊字符串,都是可以被识别转换为无穷大无穷小
因为数据库设置的字段类型是 decimal ,写入无穷大的值,自然是长度超出
找到问题所在,那么接下来就是要解决啦
正常API业务处理,无论是 无穷大 还是 无穷小 都属于不合法的参数值,可按0处理
所以在 strconv.ParseFloat 加了个 判断 参数值 含英文字母,即返回 0
这是检查字符串是否含英文字母的工具方法
func ContainsEnglish(str string) bool { dictionary := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" for _, v := range str { if strings.Contains(dictionary, string(v)) { return true } } return false }
End.
night nice~~
标签:无穷大,Infinity,无穷小,写入,golang,字符串,Inf From: https://www.cnblogs.com/ecake/p/17403498.html