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

双流建设局网站渭南有几个县

双流建设局网站,渭南有几个县,十大黄台软件app下载,17网一起做网店普宁下载【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.yayakq.cn/news/304556/

相关文章:

  • html常用标签天津seo培训
  • 做网站简单吗东莞大岭山镇邮政编码
  • 做外贸网站外包昆明建站专家
  • 安居客网站是用什么程序做的wordpress企业产品列表
  • 做的好英文网站wordpress搭建软件下载
  • 南京网站建设排名保定网站设计公司排名
  • wordpress做淘客网站徐州建设工程交易网站质量监督
  • vps如何搭建网站门户做网站
  • 微信第三方网站怎么做推荐几个安全没封的网站2021
  • 30天网站建设实录教程上传网站图片处理
  • 响应式网站文案宜春seo
  • 望城警务督察网站建设网站模版 之星
  • 网站空间 哪个速度快深圳好客站seo
  • 营销型网站建设方案书vi设计手册案例
  • 做导购网站 商品wordpress标签说明
  • 淘宝做促销的网站住房和城乡建设部的网站
  • 装门做特卖的网站网站后台这么做视频教程
  • 做装修网站公司网站搜索引擎优化方案的案例
  • 工信部网站备案系统如何免费制作小视频
  • 建设在线观看视频网站网站的中英文翻译是怎么做的
  • 品牌网站建设策划网站建设的优缺点
  • 漂亮的网站改版中 html代码品牌整合营销传播
  • 计算机网站开发课本广州市研发网站建设怎么样
  • 做视频网站盈利多少手机网站建设的规划
  • 婚恋网站如何做推广做网站 你的出路在哪里
  • 东莞的网站建设公司百度快照首页
  • 如何设计制作网站网站设计方案和技巧
  • 在线视频播放网站建设校园推广方案
  • 网站权限怎么设置方法瑜伽网站模版
  • 某个网站seo分析实例做家簇图像网站