首頁  >  文章  >  後端開發  >  Go大佬良心發現,願意給 map 加清除了?

Go大佬良心發現,願意給 map 加清除了?

Golang菜鸟
Golang菜鸟轉載
2023-08-04 17:20:33651瀏覽


一個東西來來回回的討論,關了又開,關了後建新的,新的被ban 了,又發現新的論據,再打開新的。這在職場工作中很常見,在 Go 的提案討論中,也出現了...

今天要分享的是 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 ≥ xFalse NaN ≤ xFalse#NaN > xFalse#NaN FalseNaN = xFalseNaN ≠ x# ## ###真的###########

這裡的理解對於下面的考題很重要。

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[1]》。如下圖:

Go大佬良心發現,願意給 map 加清除了?

希望藉此來解決 NaN 的 map 問題,並同時完成一直以來討論的 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?

以上是Go大佬良心發現,願意給 map 加清除了?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:Golang菜鸟。如有侵權,請聯絡admin@php.cn刪除