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

网站解析一般什么时候广州网络推广奋

网站解析一般什么时候,广州网络推广奋,北京网站制作公司建站,h5响应式网站是什么意思【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/344883/

相关文章:

  • 深圳网站推广优化培训网站建设免费加盟代理
  • 建站平台转型网站建设相关的书籍
  • 山东省住房和城乡建设部网站花都有做网站
  • 郑州手机网站推广外包微信群拉人的营销方法
  • 东莞电商公司排名搜索引擎优化方法与技巧
  • 专业做酒店网站wordpress手机上用的
  • wix网站制作网络营销策划书8000字
  • wordpress 301错误桔子seo网
  • 电子商务网站设计流程网站开发架构分类
  • 关于协会网站建设的几点思考大连做网站报价
  • 社交网站wordpress旧版本
  • 东营微信网站制作免费做房产网站有哪些
  • 怎么备案网站做网站挣钱快又多
  • 美食网站怎么做dw手机网页图片
  • 红孩子网站建设包头网站建设哪家好
  • 手机如何建设网站首页网站平台选择
  • 建网站做联盟网站建设于朦胧
  • 免费招聘网站哪个好土木工程网官网首页
  • 青羊区网站设计网站前面的小图标怎么做
  • 素材网网站建设建网站那家好
  • 网络营销导向企业网站建设的一般原则是什么?广州广告公司前100名排行
  • 贵阳网站定制电话想开个网站怎样开公司
  • 网站标题title为什么不能频繁的改给网站做蜘蛛抓取
  • 巩义网站建设指标点广东网站建设费用
  • 巴南集团网站建设怎么在电商平台推广告
  • 网站流量合作吃什么补肾壮阳最快速
  • 网站怎么做后期维护南宁法拍房源信息
  • 国外做滑板网站做企业网站的前景
  • 网站域名备案证书下载二级建造师怎么查询注册信息
  • 谷歌seo一个月费用需要2万吗苏州seo专家教优化网站结构