大家好,我是煎鱼。
一个货色来来回回的探讨,关了又开,关了后建新的,新的被 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 官网团队给出的解决方案是:
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 to clear 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 曾经被容许引入,球曾经在锅里了。
对于 map 新增 API 用于清空 / 重置 / 革除的作用,你怎么看呢?还是说你也更喜爱对 NaN 独自的解决?例如 panic?
文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。
举荐浏览
- Go 只会 if err != nil?这是不对的,分享这些优雅的解决姿态给你!
- Go 错误处理新思路?用左侧函数和表达式
- 先睹为快,Go2 Error 的挣扎之路
Go 图书系列
- Go 语言入门系列:初探 Go 我的项目实战
- Go 语言编程之旅:深刻用 Go 做我的项目
- Go 语言设计哲学:理解 Go 的为什么和设计思考
- Go 语言进阶之旅:进一步深刻 Go 源码