当前位置: 首页 > news >正文

网站开发 实战宁波优化系统

网站开发 实战,宁波优化系统,域名暂无法进行网站备案,医院网站优化策划【Golang】Json 无法表示 float64 类型的 NaN 以及 Inf 导致的 panic 原因 golang 服务出现了 panic,根据 panic 打印出的堆栈找到了问题代码,看上去原因是:json 序列化时,遇到了无法序列化的内容 [panic]: json: unsupported …

【Golang】Json 无法表示 float64 类型的 NaN 以及 Inf 导致的 panic

原因

golang 服务出现了 panic,根据 panic 打印出的堆栈找到了问题代码,看上去原因是:json 序列化时,遇到了无法序列化的内容

[panic]: json: unsupported value: NaN or Infinite

在这里插入图片描述

NaN 以及 Infinite

解释:基本可以判断出:NaN 以及 Inf 是 float64 类型的两种特例,Json 无法表示这类数据,故 panic在这里插入图片描述

深度剖析

查阅 log 看到,这里最原始的 NaN 其实是字符串"NaN",明明是字符串,是如何将 "NaN"转变为 float64 的呢?问题出在使用的 cast 包的 ToFloat64上
在这里插入图片描述
可以从 ToFloat64 的源码中看到,当需要转换成 float64 的类型是 string 或者 json.Number 时,调用的都是 strconv.ParseFloat 函数(s.Float64 本质也是调用该函数),继续阅读 strconv.ParseFloat,我们可以在strconv/atof.go文件中看到以下代码:strconv.ParseFloat 会将字符串 NaN 以及 Inf 转换为 float64 类型的 NaN 以及 Inf。 而 json 无法处理这两种数据,会直接 panic在这里插入图片描述

修复

单独判断下即可

func SetValWhenFloatIsNaNOrInf(val float64) float64 {if math.IsNaN(val) {return 0.00}if math.IsInf(val, 0) {return 100.00}return val
}

扩展

NaN 和 Inf 怎么来的呢
在这里插入图片描述
在 float64 类型中,我们可以通过 zero/zero 来得到 NaN,也可以用过 除零 操作来得到 Inf,在 Google 并没有得到能解释这两种常量存在的原因,只从二进制浮点数算术标准(IEEE 754)看到有相关的定义在这里插入图片描述
能否把 NaN 以及 Inf 作为 map 的 key?
测试代码

func TestNaNKeyMap() {m := make(map[float64]struct{}, 0)for i := 0; i < 10; i++ {m[math.NaN()] = struct{}{}fmt.Printf("nan map len:%d\n", len(m))}
}
func TestInfKeyMap() {m := make(map[float64]struct{}, 0)for i := 0; i < 10; i++ {m[math.Inf(0)] = struct{}{}fmt.Printf("inf map len:%d\n", len(m))}
}

结果:可以看待对于 NaN,每次赋值的时候,其实都是给不同的 key 赋值,而 Inf 则不是;所以我们可以得出以下结论:map[float64]struct 这种以 float64 为 key 的 map,存在内存泄漏的可能
在这里插入图片描述
map 的 key 都会经过 hash,然后再确定value 存储的位置,那么问题大概率出在 hash 算法上,在 runtime/alg.go 找到以下函数:在这里插入图片描述
可以看到,算法里判断到 f != f 时,会给hash 值增加一个随机数,并且注释里也说了是为了适配 any kind of NaN
这里 f != f 的判断也同时用在 func IsNaN(f float64) (is bool) 函数中。

http://www.yidumall.com/news/82822.html

相关文章:

  • wordpress 登陆后查看宁波seo优化公司排名
  • 西安阎良区建设局网站今日头条新闻消息
  • 做网站会员金字塔系统网站推广优化排名教程
  • 17网站一起做网店普宁万网域名管理平台
  • 佛山顺德专业做网站seo相关岗位
  • 备案的网站 ,能拿来做仿站吗免费智能seo收录工具
  • 企业做定制网站的好处seo优化工作
  • 汕头网站制作网站广州seo做得比较好的公司
  • 做网站自己能做百度推广吗网络营销师资格证
  • sharepoint 网站开发天津百度推广中心
  • 给小孩做辅食的网站乔拓云建站平台
  • 做php门户网站那个系统好数据分析培训课程
  • 金融网站建设公司免费友情链接网页
  • 做外贸必须有公司网站么seo综合优化公司
  • 张店区创业孵化中心有做网站的吗直播引流推广方法
  • 香港公司网站可以备案吗百度搜索引擎优化公司哪家强
  • 网站建站推广短视频营销成功的案例
  • 设计高端网站西安seo排名优化推广价格
  • ppt做的最好的网站有哪些网页制作素材模板
  • 怎样可以做网站百度数据研究中心
  • 平阳网站建设外链
  • 网站上的个人词条怎么做的竞价托管代运营
  • 推荐10个网站推广代理平台登录
  • wordpress elementor天津百度seo推广
  • 输变电壹级电力建设公司网站5118网站查询
  • 公司网站建设推广百度如何投放广告
  • 用dw做的网站容易变形石家庄百度搜索引擎优化
  • 门户网站指的是什么seo服务外包
  • 东莞企石做网站国外网站开发
  • 网站底部有很多图标企业关键词排名优化网址