我们好,我是煎鱼。

一个东西来来回回的评论,关了又开,关了后建新的,新的被 ban 了,又发现新的论据,再翻开新的。这在职场工作中很常见,在 Go 的提案评论中,也呈现了。

今日要给我们介绍的是 map 在 NaN 上的一个小争议和或许行将呈现的 API 添加。

布景和考题

NaN 是什么

在计算机科学中,有一个奇特的值,叫做: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)进行比较时,比较成果如下:

比较 成果
NaN ≥ x False
NaN ≤ x False
NaN > x False
NaN < x False
NaN = x False
NaN ≠ x True

这里的了解关于下面的考题很重要。

Go IEEE-754 考题

在 Go101 上看到一道关于 IEEE-754 浮点数的题,我这里引证标题,以下代码输出什么?

如下代码:

package main
import "math"
func main() {
	a, b, c := 2.0, 1.0, 0.0
	x, y := a/c, b/c     // infinity
	n := math.NaN()      // not a number
	m := math.Sqrt(-1.0) // not a number
	println(x == y, m == n)
}
  • A:true true。
  • B:true false。
  • C:false false。
  • D:false true。

答案是啥?是 A 吗,仍是 D?

对上述程序进行解析,变量 x,y 是 +Inf 正无量。m,n 是 NaN 无量值。

正确的答案是:B。

你答对了吗?

提案

在对 NaN 有了基本的了解后,我们能够正式进入主题了。在 Go map 关联提案中,常说到新增 API,用于满足清空 map 的诉求:

Go 大佬良心发现,愿意给 map 加清除了?

但在多次评论中,Go 官方团队给出的处理方案是:

for k := range m {
    delete(m, k)
}

并关闭了相关的提案,结束了这个议题。留下满脸 ”好吧,这都行“ 的疑惑打工人的我们,这是这类提案的布景。

但这块有一个坑,在包括任何 NaN 键值时,将无法通过循环 delete 的方式清空 map。一旦你 map 有 NaN,但你又 for+delete,认为删掉了,其实并没有,就会发生类似泄露的效果。

因此 Go 团队的灵魂人物 Russ Cox,从头发起了新提案《proposal: spec: add delete(m) to clear map》。如下图:

Go 大佬良心发现,愿意给 map 加清除了?

期望借此来处理 map 在 NaN 的问题,并同时完结一直以来评论的 map 清空/重置/清理等社区诉求。

也就是新增,如下特性:

delete(m)

支持铲除 map 的功用(即使包括 NaN)。

总结

针对这个提案也有几种声响,分别是万恶的命名,对叫 delete,仍是叫 clear 都有着不同的见地。

// Clear removes all entries from m, leaving it empty.
func Clear[M ~map[K]V, K comparable, V any](m M "M ~map[K]V, K comparable, V any")
delete(m)

也有声响说到不答应引进 NaN 值,但显然。在 Go1 已经很难了,由于 NaN 已经被答应引进,球已经在锅里了。

Go 大佬良心发现,愿意给 map 加清除了?

关于 map 新增 API 用于清空/重置/铲除的作用,你怎么看呢?仍是说你也更喜欢对 NaN 单独的处理?例如 panic?

文章持续更新,能够微信搜【脑子进煎鱼了】阅读,本文 GitHub github.com/eddycjy/blo… 已收录,学习 Go 言语能够看 Go 学习地图和路线,欢迎 Star 催更。

引荐阅读

  • Go 只会 if err != nil?这是不对的,共享这些高雅的处理姿态给你!
  • Go 错误处理新思路?用左边函数和表达式
  • 先睹为快,Go2 Error 的挣扎之路

Go 图书系列

  • Go 言语入门系列:初探 Go 项目实战
  • Go 言语编程之旅:深化用 Go 做项目
  • Go 言语规划哲学:了解 Go 的为什么和规划考虑
  • Go 言语进阶之旅:进一步深化 Go 源码