日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Go 大佬良心發(fā)現(xiàn),愿意給 Map 加清除了?

大家好,我是煎魚。

創(chuàng)新互聯(lián)專注于中大型企業(yè)的成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)和網(wǎng)站改版、網(wǎng)站營(yíng)銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計(jì)客戶1000+,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長(zhǎng)!

一個(gè)東西來來回回的討論,關(guān)了又開,關(guān)了后建新的,新的被 ban 了,又發(fā)現(xiàn)新的論據(jù),再打開新的。這在職場(chǎng)工作中很常見,在 Go 的提案討論中,也出現(xiàn)了...

今天要分享的是 Go map 在 NaN 上的一個(gè)爭(zhēng)議和可能即將出現(xiàn)的 API 增加。

背景和考題

NaN 是什么

在計(jì)算機(jī)科學(xué)中,有一個(gè)神奇的值,叫做:NaN(Not a Number,非數(shù))。它是數(shù)值數(shù)據(jù)類型的一類值,表示未定義或不可表示的值。常在浮點(diǎn)數(shù)運(yùn)算中使用。首次引入 NaN 的是 1985 年的 IEEE 754 浮點(diǎn)數(shù)標(biāo)準(zhǔn)。

在與 NaN 值的存儲(chǔ)和比較時(shí),會(huì)有問題。因?yàn)榕袛嘁粋€(gè)值是否為 NaN 時(shí),不能通過判斷 x=NaN 或 x≠NaN 來進(jìn)行比較。但因?yàn)?NaN 永遠(yuǎn)不等于其自身,因此可通過判斷 x=x 或 x≠x 來判斷 x 是否為 NaN 值,將會(huì)分別返回 False 和 True。

當(dāng) NaN 與另一個(gè)浮點(diǎn)數(shù) x(其中 x 可為正常值、正負(fù)無窮大或 NaN)進(jìn)行比較時(shí),比較結(jié)果如下:

比較

結(jié)果

NaN ≥ x

False

NaN ≤ x

False

NaN > x

False

NaN < x

False

NaN = x

False

NaN ≠ x

True

這里的理解對(duì)于下面的考題很重要。

Go IEEE-754 考題

在 Go101 上看到一道關(guān)于 IEEE-754 浮點(diǎn)數(shù)的題,我這里引用題目,以下代碼輸出什么?

如下代碼:

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?

對(duì)上述程序進(jìn)行解析,變量 x,y 是 +Inf 正無窮。m,n 是 NaN 無窮值。

正確的答案是:B。

你答對(duì)了嗎?

提案

在對(duì) NaN 有了基本的了解后,我們可以正式進(jìn)入主題了。在 Go map 關(guān)聯(lián)提案中,常提到新增 API,用于滿足清空 map 的訴求:

但在多次討論中,Go 官方團(tuán)隊(duì)給出的解決方案是:

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

并關(guān)閉了相關(guān)的提案,結(jié)束了這個(gè)議題。留下滿臉 ”好吧,這都行“ 的疑惑打工人的我們,這是這類提案的背景。

但這塊有一個(gè)坑,在包含任何 NaN 鍵值時(shí),將無法通過循環(huán) delete 的方式清空 map。一旦你 map 有 NaN,但你又 for+delete,以為刪掉了,其實(shí)并沒有,就會(huì)產(chǎn)生類似泄露的效果。

因此 Go 團(tuán)隊(duì)的靈魂人物 Russ Cox,重新發(fā)起了新提案《proposal: spec: add delete(m) to clear map[1]》。如下圖:

希望借此來解決 map 在 NaN 的問題,并同時(shí)完成一直以來討論的 map 清空/重置/清理等社區(qū)訴求。

也就是新增,如下特性:

delete(m)

支持清除 map 的功能(即使包含 NaN)。

總結(jié)

針對(duì)這個(gè)提案也有幾種聲音,分別是萬惡的命名,對(duì)叫 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 已經(jīng)很難了,因?yàn)?NaN 已經(jīng)被允許引入,球已經(jīng)在鍋里了。

對(duì)于 map 新增 API 用于清空/重置/清除的作用,你怎么看呢?還是說你也更喜歡對(duì) NaN 單獨(dú)的處理?例如 panic?

參考資料

[1]proposal: spec: add delete(m) to clear map: https://github.com/golang/go/issues/56351


本文題目:Go 大佬良心發(fā)現(xiàn),愿意給 Map 加清除了?
文章源于:http://m.5511xx.com/article/djghihe.html