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

Go for range 一不小心就掉坑里了

開發 項目管理
for循環問題,在面試中經常都會被問到,并且在實際業務項目中也經常用到for循環,要是沒用好,一不下心就掉坑。

前言

為了讓大家更好的理解本期知識點,先介紹以下幾個知識點:線性結構、非線性結構、循環、迭代、遍歷、遞歸。

  • 線性結構:數組、隊列
  • 非線性結構:樹、圖
  • 循環(loop):最基礎的概念,所有重復的行為都是循環
  • 遞歸(recursion):在函數內調用自身,將復雜情況逐步轉化成基本情況
  • (數學)迭代(iterate):在多次循環中逐步接近結果
  • (編程)迭代(iterate):按順序訪問線性結構中的每一項
  • 遍歷(traversal):按規則訪問非線性結構中的每一項

下面會挑選幾個經典的案例,一塊來探討下,看看如何避免掉坑,多積累積累采坑經驗。

1. for+傳值

先來到開胃菜,熱熱身~

type student struct {
name string
age int
}

func main() {
m := make(map[string]student)
stus := []student{
{name: "張三", age: 18},
{name: "李四", age: 23},
{name: "王五", age: 26},
}
for _, stu := range stus {
m[stu.name] = stu
}
for k, v := range m {
fmt.Println(k, "=>", v.name)
}
}

不出意料,輸出結果為:

李四 => 李四
王五 => 王五
張三 => 張三

這題比較簡單,就是簡單的傳值操作,大家應該都能答上來。下面加大難度,改為傳址操作

2. for+傳址

將案例一改為傳址操作

type student struct {
name string
age int
}

func main() {
m := make(map[string]*student)
stus := []student{
{name: "張三", age: 18},
{name: "李四", age: 23},
{name: "王五", age: 26},
}
for _, stu := range stus {
m[stu.name] = &stu
}
for k, v := range m {
fmt.Println(k, "=>", v.name)
}
}

好好想想應該輸出什么結果呢?還是跟案例一是一樣的結果嗎?難道會有坑?

不出意料,還是出了意外,輸出結果為:

張三 => 王五
李四 => 王五
王五 => 王五

為什么呢?

  • 首先,關鍵點在于Go的for循環,對循環變量stu?每次是循環并不是迭代(簡單的說,就是對循環變量stu只會做一次聲明和內存地址的分配,后面循環就是不斷更新值);
  • 所以,取址操作 &stu,其實都是取的同一個變量的地址,只是值被循環更新為最后一個元素的值;
  • 最終,輸出的v.name,都是最后一個元素的name為王五。

解決方案:

在for循環中,做同名變量覆蓋stu:=stu(即重新聲明一個局部變量,做值拷貝,避免相互影響)

type student struct {
name string
age int
}

func main() {
m := make(map[string]*student)
stus := []student{
{name: "張三", age: 18},
{name: "李四", age: 23},
{name: "王五", age: 26},
}
for _, stu := range stus {
stu := stu //同名變量覆蓋
m[stu.name] = &stu
}
for k, v := range m {
fmt.Println(k, "=>", v.name)
}
}

輸出結果:
張三 => 張三
李四 => 李四
王五 => 王五

3.for+閉包

在for循環里,做閉包操作,也是很容易掉坑的。看看下面輸出什么?

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

一眼看過去,感覺是輸出1 2 3,但實際會輸出 3 3 3

為什么呢?

  • 首先,在分析了案例二后,我們知道了Go的for循環對循環變量v,其實每次是循環并不是迭代;
  • 然后,閉包=函數+引用環境,在同一個引用環境下,循環變量v的值會被不斷的覆蓋;
  • 所以最終,在打印時,輸出的v,都是最后一個值3。

解決方案:

和案例二解決方案一樣,是在for循環中,做同名變量覆蓋v:=v

var prints []func()
for _, v := range []int{1, 2, 3} {
v := v //同名變量覆蓋
prints = append(prints, func() { fmt.Println(v) })
}
for _, print := range prints {
print()
}

輸出結果:
1
2
3

4. for+goroutine

在for循環里,起goroutine協程,也是很迷惑很容易掉坑的。看看下面輸出什么?

var wg sync.WaitGroup
strs := []string{"1", "2", "3", "4", "5"}
for _, str := range strs {
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println(str)
}()
}
wg.Wait()

一眼看過去,感覺是會無序輸出1 2 3 4 5,但實際會輸出 5 5 5 5 5

為什么呢?

  • 首先,要記得Go的for循環對循環變量str,其實每次是循環并不是迭代;
  • 然后,main協程會和新起的協程做相互博弈,看誰執行更快,按這個案例執行情況來看,main協程執行速度明顯比新起的協程會更快,所以str被更新為最后一個元素值5(備注:并非絕對);
  • 最終,在新起的協程中,使用str時值都為5,作為結果去輸出;
  • 拓展:如果在新起協程前,sleep個5s,輸出結果又會截然不同,感興趣的同學可以自行實驗下,然后逐步深入地了解下GMP調度機制。

解決方案:

和前面兩個案例解決方案一樣,是在for循環中,做同名變量覆蓋str:=str

var wg sync.WaitGroup
strs := []string{"1", "2", "3", "4", "5"}
for _, str := range strs {
str := str //同名變量覆蓋
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println(str)
}()
}
wg.Wait()

輸出結果:
5
4
2
1
3
注意是1~5無序輸出

總結

for循環中做傳址、閉包、goroutine相關操作,千萬要注意,一不小心就會很容易掉坑。

使用好同名變量覆蓋v:=v,這個解決大法,能很便捷的解決這一類問題。

本文轉載自微信公眾號「 程序員升級打怪之旅」,作者「王中陽Go」,可以通過以下二維碼關注。

轉載本文請聯系「 程序員升級打怪之旅」公眾號。

責任編輯:武曉燕 來源: 程序員升職加薪之旅
相關推薦

2021-07-28 05:01:29

Lombok前端測試

2025-12-02 00:02:00

GoMySQL數據

2021-01-05 22:49:37

Python編程語言Java

2021-04-30 08:21:22

Linux管道設計

2025-03-05 00:27:00

2020-10-26 08:56:32

技術總監程序員

2021-10-07 16:45:06

MySQL數據庫

2024-05-13 07:58:52

開源項目PR

2018-01-18 22:26:30

2021-03-29 18:47:53

APP服務端通信安全數據安全

2021-01-30 09:50:54

MySQL密碼服務器

2020-10-28 15:07:01

Arthas

2019-09-19 20:47:29

刷臉支付人臉識別人工智能

2020-09-29 07:44:20

跨域前后端分離插件

2021-01-08 09:36:23

程序員比特幣黑客

2020-11-24 11:30:51

SpringJava代碼

2021-03-26 06:14:26

Hashcode項目排查

2020-04-30 09:45:41

安卓App小米

2022-09-27 18:19:32

Java數據結構

2019-07-29 14:38:35

服務器開發工具
點贊
收藏

51CTO技術棧公眾號

国产对白叫床清晰在线播放| 欧美在线播放高清精品| 成人国产精品av| 久久久久毛片| 国产亚洲综合久久| 18aaaa精品欧美大片h| 日韩欧美国产视频| 欧美另类极限扩张| 亚洲精品视频在线观看网站| 97干在线视频| 国产精品综合av一区二区国产馆| av资源一区二区| 午夜国产精品视频免费体验区| 欧洲日韩成人av| 看全色黄大色大片免费久久久| 欧美成年人视频网站| 影视一区二区三区| 中文字幕亚洲精品| 成人在线视频www| 久久精品色欧美aⅴ一区二区| **欧美日韩在线观看| 亚洲人a成www在线影院| 成人av免费电影网站| 亚洲视频自拍偷拍| 国产美女亚洲精品7777| 欧美激情三级免费| 婷婷五月色综合香五月| 国产精品高潮在线| 欧美在线网址| 国产精品三区www17con| 国产日韩免费| 亚洲国产精品综合| 风间由美性色一区二区三区| 国产黄视频在线| 中文字幕一区二区三区四区不卡 | 久久九九影视网| 91极品视频在线观看| 一区精品在线播放| 在线视频三级| 欧美精品777| 成人美女黄网站| 欧美国产精品人人做人人爱| 国产在视频线精品视频www666| 114国产精品久久免费观看| 国产精品五区| 免费看一级大黄情大片| 一区二区在线观看视频| 久久久久久久影视| 亚洲精选中文字幕| 色婷婷综合久久久久久| 国产伦精品一区二区三区免 | 二人午夜免费观看在线视频| 欧美亚洲一区二区在线观看| 成人欧美在线| 中文字幕亚洲欧美一区二区三区 | 欧美三级网色| 不卡电影免费在线播放一区| 中文字幕网av| 91国偷自产一区二区三区观看 | 91在线播放国产| 日韩高清欧美激情| 国产又黄又大又粗视频| 欧美日韩在线第一页| 自拍在线观看| 国产精品成人播放| 国产一区美女在线| 羞羞网www| 亚洲精品美女网站| 成人嫩草影院| 久久男人资源站| 精品国产乱码久久久久久婷婷| 国产www视频在线观看| 欧美国产日韩精品| 日日噜噜夜夜狠狠视频欧美人| 国产成人久久婷婷精品流白浆| 色一情一乱一乱一91av| 国产成人77亚洲精品www| 国产欧美日韩视频| 99国产精品国产精品久久| 加勒比一区二区三区在线| 色偷偷偷亚洲综合网另类| 好吊视频一区二区三区四区| 18禁男女爽爽爽午夜网站免费| 欧美日韩久久久一区| 欧美大胆a级| 91免费视频黄| 欧美小视频在线| 97se亚洲国产一区二区三区| 欧美在线激情| 午夜久久久久久久久| 欧美天堂在线| 色综合久久久久久久久五月| 亚洲成av人综合在线观看| 成人精品国产| 亚洲v国产v| 色婷婷综合视频在线观看| 成人性生交大片免费看中文视频| 麻豆av一区二区| 亚洲va国产va欧美va观看| 久久人人视频| 亚洲欧洲一区二区在线观看| 欧美日韩在线另类| 久久动漫网址| 九色在线视频观看| 亚洲激情在线视频| 亚洲欧洲日本mm| 成人c视频免费高清在线观看| 久久久精品视频在线观看| 日韩激情在线观看| av电影在线观看一区二区三区| 青青久久av北条麻妃海外网| caoporm超碰国产精品| 国产区美女在线| 97久久天天综合色天天综合色hd| 中文字幕一区日韩精品欧美| 久久日本片精品aaaaa国产| 五月天婷亚洲天综合网鲁鲁鲁| 色av一区二区| 日韩精品电影| 全网国产福利在线播放| 97人人做人人爱| 国产精品乱码一区二三区小蝌蚪| 成人午夜精品| 成人一级生活片| 亚洲欧洲xxxx| 成人精品小蝌蚪| 三级成人在线| www.av毛片| 色老头一区二区三区| 成人午夜在线播放| 另类一区二区三区| av天堂永久资源网| 欧美精品少妇videofree| 久久综合狠狠综合| julia中文字幕一区二区99在线| 国产精品免费成人| 韩国日本不卡在线| 一级精品视频在线观看宜春院| 久久99精品久久久久久园产越南| 国产免费视频| 成人a在线视频| 欧洲一区在线电影| 天堂va蜜桃一区二区三区漫画版| 欧美草逼视频| 黄色片免费在线观看视频| 综合网中文字幕| 久久尤物电影视频在线观看| av成人资源| 成人福利视频导航| 国产精华一区二区三区| 欧美精品一卡两卡| 久久99热99| 精品久久亚洲| 人与动性xxxxx免费视频| 成人免费视频网| 欧美一级高清大全免费观看| 狠狠狠色丁香婷婷综合激情| 国产日韩中文在线中文字幕| 欧美aaa一级| 蜜桃网站成人| 夜夜嗨av色一区二区不卡| www国产精品av| 国内精品久久久久久99蜜桃| 国产大学生校花援交在线播放| 日本在线视频不卡| 色777狠狠综合秋免鲁丝| 国产精品无人区| 欧美三级第一页| 中文在线а√在线8| www.com黄色片| 国产精品久久国产三级国电话系列 | 欧美va在线观看| 精品999在线| 国产日韩欧美一区二区三区四区| 欧美成人一区二区三区在线观看| av日韩在线网站| 欧美亚洲激情| 美女高潮在线观看| 国产毛片视频| 欧美亚洲免费高清在线观看| 日韩中文视频免费在线观看| 五月婷婷激情综合| 国产成人av自拍| 区一区二视频| 亚洲天堂av影院| 在线观看免费网站| 51xx午夜影福利| 成人淫片在线看| 中文字幕欧美视频在线| 精品久久久久久久久久 | 亚洲欧洲精品一区二区三区波多野1战4| 久久久av免费| 欧美少妇一区二区| 国产不卡在线视频| 999久久久91| av在线亚洲一区| 欧美24videosex性欧美| 丝袜国产免费观看| 欧美 日韩 亚洲 一区| 国产伦精品一区二区三区照片91|