golang面試基礎系列-range的坑(三)

Go 中秉沼,for range 用來遍歷 slice, map, chan 等氧猬,使用頻率很高,但遍歷雖好用漠魏,卻很容易踩坑妄均,且看 demo 如下:

1. 只有一個返回值時,則第一個參數(shù)是 index

package main

import "fmt"

func main() {
  s := []string{"a", "b", "c"}

  // 只有一個返回值:則第一個參數(shù)是index
  for v := range s {
    fmt.Println(v)
  }

  // 兩個返回值
  for i, v := range s {
    fmt.Println(i, v)
  }
}

輸出結果如下:

0
1
2
=============
0 a
1 b
2 c

2. 遍歷 map 為隨機序輸出禁熏,slice 為索引序輸出

package main

import "fmt"

func main() {
  m := make(map[string]string)

  m["aaa"] = "AAA"
  m["bbb"] = "BBB"
  m["ccc"] = "CCC"
  m["ddd"] = "DDD"
  m["eee"] = "EEE"

  // range map 為隨機序輸出
  for i, v := range m {
    fmt.Println(i, v)
  }

  fmt.Println("==================")

  s := []string{"aaa", "bbb", "ccc", "ddd", "eee"}
  
  // range slice 為索引序輸出
  for i, v := range s {
    fmt.Println(i, v)
  }
}

輸出結果如下:


ddd DDD
eee EEE
aaa AAA
bbb BBB
ccc CCC
==================
0 aaa
1 bbb
2 ccc
3 ddd
4 eee

3. range v 是值拷貝瞧毙,且只會聲明初始化一次

package main

import "fmt"

func main() {
  ParseStudent()
}

type student struct {
  Name string
  Age  int
}

func ParseStudent() {
  m := make(map[string]*student)
  stus := []student{
    {Name: "zhang", Age: 22},
    {Name: "li", Age: 23},
    {Name: "wang", Age: 24},
  }
  for _, stu := range stus {
    // 都指向了同一個stu的內(nèi)存指針宙彪,為什么有巧?
    // 因為 for range 中的 v 只會聲明初始化一次
    // 不會每次循環(huán)都初始化,最后賦值會覆蓋前面的

    fmt.Printf("%p\n", &stu)

    // 1. bad
    m[stu.Name] = &stu

    // 2. good
    /*newStu := stu
    m[stu.Name] = &newStu*/
  }

  for i, v := range m {
    fmt.Println(i, v)
  }
}

輸出結果如下:

0xc00008e020
0xc00008e020
0xc00008e020
zhang &{wang 24}
li &{wang 24}
wang &{wang 24}

正確做法應該是:將 good 部分注釋打開男图,運行結果如下:

0xc00000c080
0xc00000c080
0xc00000c080
li &{li 23}
wang &{wang 24}
zhang &{zhang 22}


小結:for range 遍歷注意以上幾個小坑:

  1. 只有一個返回值時甜橱,則第一個參數(shù)是index
  2. 遍歷 map 為隨機序輸出览露,slice 為索引序輸出譬胎;
  3. range v 是值拷貝,且只會聲明初始化一次堰乔;
    掌握以上幾點后脐恩,就讓我們愉快的使用 range 吧~
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市苟翻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沈条,老刑警劉巖诅炉,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涕烧,死亡現(xiàn)場離奇詭異,居然都是意外死亡议纯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門憨攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浓恶,“玉大人结笨,你說我怎么就攤上這事】晃” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵树肃,是天一觀的道長胸嘴。 經(jīng)常有香客問我斩祭,道長,這世上最難降的妖魔是什么摧玫? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮闸婴,結果婚禮上芍躏,老公的妹妹穿的比我還像新娘。我一直安慰自己溺欧,他們只是感情好柏肪,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布烦味。 她就那樣靜靜地躺著,像睡著了一般柏靶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屎蜓,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天炬转,我揣著相機與錄音算灸,去河邊找鬼。 笑死菲驴,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的先煎。 我是一名探鬼主播巧涧,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼褒侧!你這毒婦竟也來了闷供?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤疑俭,失蹤者是張志新(化名)和其女友劉穎婿失,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哩照,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡飘弧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年次伶,在試婚紗的時候發(fā)現(xiàn)自己被綠了稽穆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡柱彻,死狀恐怖乎折,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吓蘑,我是刑警寧澤坟冲,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站琳猫,受9級特大地震影響私痹,放射性物質(zhì)發(fā)生泄漏统刮。R本人自食惡果不足惜侥蒙,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一匀奏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧论衍,春花似錦聚磺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捣鲸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愁溜,已是汗流浹背外厂。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留渐扮,地道東北人掖棉。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓幔亥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帕棉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容