大家好,我是煎鱼。,一个东西来来回回的讨论,关了又开,关了后建新的,新的被 ban 了,又发现新的论据,再打开新的。这在职场工作中很常见,在 Go 的提案讨论中,也出现了…,今天要分享的是 Go map 在 NaN 上的一个争议和可能即将出现的 API 增加。,在计算机科学中,有一个神奇的值,叫做:NaN(Not a Number,非数)。它是数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。首次引入 NaN 的是 1985 年的 IEEE 754 浮点数标准。,在与 NaN 值的存储和比较时,会有问题。因为判断一个值是否为 NaN 时,不能通过判断 x=NaN 或 x≠NaN 来进行比较。但因为 NaN 永远不等于其自身,因此可通过判断 x=x 或 x≠x 来判断 x 是否为 NaN 值,将会分别返回 False 和 True。,当 NaN 与另一个浮点数 x(其中 x 可为正常值、正负无穷大或 NaN)进行比较时,比较结果如下:,这里的理解对于下面的考题很重要。,在 Go101 上看到一道关于 IEEE-754 浮点数的题,我这里引用题目,以下代码输出什么?,如下代码:,答案是啥?是 A 吗,还是 D?,对上述程序进行解析,变量 x,y 是 +Inf 正无穷。m,n 是 NaN 无穷值。,正确的答案是:B。,你答对了吗?,在对 NaN 有了基本的了解后,我们可以正式进入主题了。在 Go map 关联提案中,常提到新增 API,用于满足清空 map 的诉求:,,但在多次讨论中,Go 官方团队给出的解决方案是:,并关闭了相关的提案,结束了这个议题。留下满脸 ”好吧,这都行“ 的疑惑打工人的我们,这是这类提案的背景。,但这块有一个坑,在包含任何 NaN 键值时,将无法通过循环 delete 的方式清空 map。一旦你 map 有 NaN,但你又 for+delete,以为删掉了,其实并没有,就会产生类似泄露的效果。,因此 Go 团队的灵魂人物 Russ Cox,重新发起了新提案《proposal: spec: add delete(m) to clear map[1]》。如下图:,,希望借此来解决 map 在 NaN 的问题,并同时完成一直以来讨论的 map 清空/重置/清理等社区诉求。,也就是新增,如下特性:,支持清除 map 的功能(即使包含 NaN)。,针对这个提案也有几种声音,分别是万恶的命名,对叫 delete,还是叫 clear 都有着不同的见解。,也有声音提到不允许引入 NaN 值,但显然。在 Go1 已经很难了,因为 NaN 已经被允许引入,球已经在锅里了。,,对于 map 新增 API 用于清空/重置/清除的作用,你怎么看呢?还是说你也更喜欢对 NaN 单独的处理?例如 panic?,[1]proposal: spec: add delete(m) to clear map: https://github.com/golang/go/issues/56351
© 版权声明
文章版权归作者所有,未经允许请勿转载。