golang 关于 Inf,-Inf,Infinity,-Infinity 等无穷大无穷小特殊字符转换问题

记录一个比较个例的问题,某天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~~

 

 

posted @ 2023-05-15 23:50  ecake  阅读(363)  评论(0编辑  收藏  举报