国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go for 循環(huán)有時(shí)候真的很坑。。。

開(kāi)發(fā) 前端
如果實(shí)施,本次變更會(huì)導(dǎo)致 Go 的前后版本語(yǔ)義有所不同。還不如變成一個(gè) go.mod 文件的一個(gè)語(yǔ)義開(kāi)關(guān),一變?nèi)儯駝t這種變一些不變一些的,會(huì)給問(wèn)題排查和理解上帶來(lái)不少的成本。

大家好,我是煎魚(yú)。

不知道有多少 Go 的面試題和泄露,都和 for 循環(huán)有關(guān)。今天我在周末認(rèn)真一看,發(fā)現(xiàn)了 redefining for loop variable semantics[1] ,看來(lái)大家踩到的坑都是一樣的。

著名的硬核大佬 Russ Cox 表示他一直在研究這個(gè)問(wèn)題,表示十年的經(jīng)驗(yàn)表明了當(dāng)前語(yǔ)義的代價(jià)是很大的,得動(dòng)一動(dòng),看看能不能打破兼容性原則。

想了下之前 Go modules 的事情,我真怕他一口氣就把這塔給推了...

問(wèn)題

案例一

在 Go 語(yǔ)言中,我們寫(xiě) for 語(yǔ)句時(shí)有時(shí)會(huì)出現(xiàn)運(yùn)行和猜想的結(jié)果不一致。例如以下第一個(gè)案例的代碼:

var all []*Item
for _, item := range items {
all = append(all, &item)
}

這段代碼有問(wèn)題嗎?變量 all 內(nèi)的 item 變量,存儲(chǔ)進(jìn)去的是什么?是每次循環(huán)的 item 值,每次都不一樣,對(duì)嗎?

實(shí)際上在 for 循環(huán)時(shí),每次存入變量 all 的都是相同的 item,也就是最后一個(gè)循環(huán)的 item 值。這是 Go 面試?yán)锝?jīng)常出現(xiàn)的題目,結(jié)合 goroutine 更風(fēng)騷,畢竟還會(huì)存在亂序執(zhí)行等問(wèn)題。

如果你想解決這個(gè)問(wèn)題,就需要把程序改寫(xiě)成如下:

var all []*Item
for _, item := range items {
item := item
all = append(all, &item)
}

要重新聲明一個(gè)局部變量 item 變量,把 for 循環(huán)的 item 變量給存儲(chǔ)下來(lái),再追加進(jìn)去。

案例二

接下來(lái)是第二個(gè)案例的代碼:

var prints []func()
for _, v := range []int{1, 2, 3} {
prints = append(prints, func() { fmt.Println(v) })
}
for _, print := range prints {
print()
}

這段程序的輸出結(jié)果是什么?沒(méi)有 & 取地址符,是輸出 1,2,3 嗎?

結(jié)果程序一運(yùn)行,輸出結(jié)果是 3,3,3。這又是為什么?

問(wèn)題的重點(diǎn)之一:關(guān)注到閉包函數(shù),實(shí)際上所有閉包都打印的是相同的 v,也就是輸出 3,原因是在 for 循環(huán)結(jié)束后,最后 v 的值被設(shè)置為了 3,僅此而已。

如果想要達(dá)到預(yù)期的效果,依然是使用萬(wàn)能的再賦值。改寫(xiě)后的代碼如下:

for _, v := range []int{1, 2, 3} {
v := v
prints = append(prints, func() { fmt.Println(v) })
}

增加 v := v 語(yǔ)句,程序輸出結(jié)果為 1,2,3。仔細(xì)翻翻你寫(xiě)過(guò)的 Go 工程,是不是都很熟悉?就這改造方法,贏了。

尤其是配合上 Goroutine 的寫(xiě)法,很多同學(xué)會(huì)更容易在此翻車(chē)。

解決方案

修復(fù)思路

實(shí)際上 Go 核心團(tuán)隊(duì)在內(nèi)部和社區(qū)已經(jīng)討論過(guò)許久,希望重新定義 for 循環(huán)的語(yǔ)義。要達(dá)到的目的是:使循環(huán)變量每次迭代而不是每次循環(huán)。

解決的辦法是:在每個(gè)迭代變量 x 的每個(gè)循環(huán)體開(kāi)頭,加一個(gè)隱式的再賦值,也就是 x := x,就能夠解決上述程序中所隱含的坑。

和我們現(xiàn)在做的一樣,只不過(guò)我們是自己手動(dòng)加的,Go 團(tuán)隊(duì)做的是希望在編譯器內(nèi)隱式處理。

讓用戶(hù)自己決定

比較尷尬的是 Go 團(tuán)隊(duì)在 Proposal: Go 2 transition[2] 中明確禁止重新定義語(yǔ)言的語(yǔ)義,所以 rsc 不能直接這么干。

因此 rsc 打算開(kāi)個(gè)新坑,希望將會(huì)由用戶(hù)自己決定控制這個(gè) “破壞”,方式將會(huì)是根據(jù)每個(gè) modules 的 go.mod 文件中的 go 行(版本聲明)來(lái)決定語(yǔ)義。

例如,如果是在 Go1.30 對(duì)本文討論的 for 循環(huán)將循環(huán)變量改為迭代,那么在 go.mod 文件中的 go 版本聲明是將是一個(gè)關(guān)鍵的開(kāi)關(guān)。

如下圖示:

圖片

像上圖的配置,Go 1.30 或更高版本將會(huì)每次迭代變量,而早期 Go 版本的將每次循環(huán)變量,也就是 go.mod 的 Go 版本控制了新特性的語(yǔ)義,不同 modules 都可能會(huì)因此不一樣。

如此一來(lái)上述提到的 for 循環(huán)問(wèn)題都會(huì)在一定范圍內(nèi)被解決。

總結(jié)

for 循環(huán)時(shí)的變量問(wèn)題,一直是各大 Go 考官愛(ài)考的題目,也確實(shí)在實(shí)際編程 Go 代碼時(shí)會(huì)遇到這類(lèi)坑。

雖然 rsc 希望在 go.mod 文件上開(kāi)創(chuàng)先河,利用 go 版本的聲明,去修改語(yǔ)義(不允許添加和刪除)。這無(wú)疑是給 Go1 兼容性保障開(kāi)了一個(gè)后門(mén)。

如果實(shí)施,本次變更會(huì)導(dǎo)致 Go 的前后版本語(yǔ)義有所不同。還不如變成一個(gè) go.mod 文件的一個(gè)語(yǔ)義開(kāi)關(guān),一變?nèi)儯駝t這種變一些不變一些的,會(huì)給問(wèn)題排查和理解上帶來(lái)不少的成本。

這顯然是一個(gè)很折騰人的思考題。

責(zé)任編輯:武曉燕 來(lái)源: 腦子進(jìn)煎魚(yú)了
相關(guān)推薦

2019-11-05 09:20:06

SQLiteLinux

2025-07-03 01:00:00

2010-02-23 16:21:24

Python Win

2018-10-30 12:44:04

Linux系統(tǒng)內(nèi)存

2013-04-08 15:39:15

程序員

2019-12-06 17:31:30

程序員人生第一份工作設(shè)計(jì)

2013-12-11 09:29:02

2010-01-20 10:14:53

C++程序

2025-05-28 01:10:00

SQL索引MySQL

2009-09-28 11:20:30

面試

2010-03-17 14:50:06

智能交換機(jī)

2010-03-10 11:14:56

智能交換機(jī)

2014-10-24 10:10:33

UbuntuUbuntu 14.1

2010-08-30 10:37:04

云計(jì)算

2025-05-28 00:00:00

CSS前端Flexbox

2022-11-15 11:13:10

域名Linux文件

2019-01-21 13:56:52

2023-05-22 07:10:38

GPTpromptPerplexity

2010-03-10 16:51:21

以太網(wǎng)交換機(jī)

2021-08-14 08:10:58

物聯(lián)網(wǎng)IOT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲区一区二| 欧美精品一区二区三区在线看午夜 | 在线中文av| 国产一区网站| 国产精品三级av| 国产一区影院| 色综合天天在线| 97国产精东麻豆人妻电影 | 91精品入口| 日韩av电影在线免费播放| 亚洲午夜在线观看| 国产精品二区影院| 91国内在线视频| 哺乳挤奶一区二区三区免费看| 亚洲国产精品人人做人人爽| 欧美日韩一级二级三级| 99精产国品一二三产品香蕉| 成人免费电影网址| 五月激情丁香一区二区三区| aaa国产精品视频| 9191国产精品| 国产传媒在线视频| 国产色产综合产在线视频| 轻点好疼好大好爽视频| 久久精品1区| 国产精品中出一区二区三区| 欧美电影一区| 国产剧情日韩欧美| 中文字幕中文字幕精品| 欧美极品在线视频| 精品视频在线播放一区二区三区| 亚洲精品小视频| 爱情岛论坛亚洲品质自拍视频网站 | а√在线天堂官网| 欧美一区三区| 乱熟女高潮一区二区在线| 国产精品资源站在线| 欧美激情乱人伦一区| 欧美aaaaaaaaaaaa| www.com毛片| 欧美.日韩.国产.一区.二区| 337p亚洲精品色噜噜狠狠| 天堂成人在线| 午夜激情一区二区三区| 亚洲欧美一区二区三区久久| 欧美日韩国产精品成人| 亚洲精品高清无码视频| 97se亚洲国产综合自在线观| 大胆高清日本a视频| 亚洲精彩视频| 亚洲国产日韩精品在线| 欧美一级视频免费看| 偷拍欧美精品| 97视频免费在线看| 亚洲欧洲美洲国产香蕉| 欧美福利视频网站| 国产一区二区不卡| 色涩成人影视在线播放| 久久精品久久99精品久久| 国产成人精彩在线视频九色| 日韩在线影院| 久久夜精品香蕉| 欧美综合自拍| 777亚洲妇女| 嫩草嫩草嫩草| 激情都市一区二区| 日韩一区二区三区在线播放| 国产男小鲜肉同志免费| 亚洲国产精品ⅴa在线观看| 亚洲一区二区三区精品视频 | 久久亚洲中文字幕无码| 免费看日韩精品| 九色在线视频观看| 日韩一区二区三区免费看| 国产欧美日韩在线一区二区| 久久久爽爽爽美女图片| 国产一区二区区别| 亚洲影影院av| 国产一区在线不卡| 尤物国产在线观看| 欧美自拍偷拍一区| 成入视频在线观看| 欧美国产亚洲精品久久久8v| 五月激情综合| 亚洲区一区二区三区| 久久久国产精品午夜一区ai换脸 | 色喇叭免费久久综合| 国产精品.com| 国产精品一区二区不卡| 成人羞羞视频免费看看| 欧美大片国产精品| 荡女精品导航| 日本一区免费看| 欧美国产日本韩| 国产精品毛片一区二区三区四区| 日韩精品视频免费| 欧美自拍偷拍| 奇米777四色影视在线看| 一区二区三区四区蜜桃 | 一区二区三区**美女毛片| 麻豆传媒在线完整视频| 麻豆成人在线看| 国产综合视频| 亚洲 欧美 另类人妖| 日韩欧美美女一区二区三区| 亚洲一区二区电影| 麻豆蜜桃91| 亚洲日本韩国一区| 亚洲优女在线| 波多野结衣久草一区| 26uuu国产日韩综合| 国产人成网在线播放va免费| 久久免费观看视频| 久久国产精品区| 欧美写真视频一区| 久久亚洲精品成人| 久久久久欧美精品| 免费一级淫片| 久久在线免费观看视频| 久久久精品五月天| 特级全黄一级毛片| 久久影院中文字幕| 青草av.久久免费一区| 青青操视频在线| 午夜精品一区二区三区在线视频| 七七婷婷婷婷精品国产| 免费在线观看麻豆视频| 色综合导航网站| 精品中文字幕一区二区小辣椒| 黄色毛片在线看| 国产成人精品网站| 久久精品视频免费| 国产精品第一国产精品| 日韩精品久久久毛片一区二区| 亚洲国产成人porn| 久久国产精品色av免费看| 大陆av在线播放| 精品亚洲一区二区三区| 日韩高清在线观看| 老司机精品视频在线观看6| 亚洲一区二区免费| 亚洲精选视频在线| 久久精品国产亚洲blacked| 成人黄色av片| 伊人久久久久久久久久久| 日本不卡视频在线观看| 91高清在线| 懂色一区二区三区av片| 亚洲成人av福利| 国产精品美女久久久久久不卡| 66av99| 欧美精品久久久久久久免费观看| 成人av中文字幕| 久久久久久一区二区三区四区别墅 | 狂野欧美一区| 老司机在线视频二区| 成人动漫视频在线观看完整版 | 亚洲精品国产高清久久伦理二区| 豆花视频一区二区| 激情内射人妻1区2区3区| 波霸ol色综合久久| 99久久国产综合色|国产精品| av免费在线一区| 黄色动漫网站入口| 欧美大片在线看免费观看| 亚洲欧洲性图库| 国产精品探花在线观看| 日本五十路在线| 91免费人成网站在线观看18| 91福利在线看| 男女av一区三区二区色多| 污污片在线免费视频| 亚洲一区二区三区免费观看| 精品一区二区三区电影| 国产精品123| 国产精品一区免费在线| 国产又大又黄又粗又爽| 国产成人精品视频在线| 一本色道久久综合精品竹菊| 在线视频免费在线观看一区二区| 羞羞的视频在线观看| 日本精品免费视频| 欧美成年人在线观看| 亚洲精品乱码久久久久| 欧美成人中文| 欧美伦理91| 婷婷免费在线观看| 91免费精品视频| 亚洲成人精品视频| 久久精品一区二区三区不卡 | 成人免费观看视频| 久久婷婷国产| 亚洲国产资源| 亚洲天堂电影网| 欧美激情伊人电影| 在线免费不卡视频| 福利电影一区二区| 色综合狠狠操| 筱崎爱全乳无删减在线观看 | 91国偷自产一区二区使用方法|