Go開發(fā)工程師
未來3-5年企業(yè)高性能項(xiàng)目不可替代的語言,從基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)再到重構(gòu),真正從入門到精通
for
語句代表著循環(huán)。一條語句通常由關(guān)鍵字for
、初始化子句、條件表達(dá)式、后置子句和以花括號(hào)包裹的代碼塊組成。其中,初始化子句、條件表達(dá)式和后置子句之間需用分號(hào)分隔。示例如下:
for i := 0; i < 10; i++ { fmt.Print(i, " ") }
我們可以省略掉初始化子句、條件表達(dá)式、后置子句中的任何一個(gè)或多個(gè),不過起到分隔作用的分號(hào)一般需要被保留下來,除非在僅有條件表達(dá)式或三者全被省略時(shí)分號(hào)才可以被一同省略。
我們可以把上述的初始化子句、條件表達(dá)式、后置子句合稱為for
子句。實(shí)際上,for
語句還有另外一種編寫方式,那就是用range
子句替換掉for
子句。range
子句包含一個(gè)或兩個(gè)迭代變量(用于與迭代出的值綁定)、特殊標(biāo)記:=
或=
、關(guān)鍵字range
以及range
表達(dá)式。其中,range
表達(dá)式的結(jié)果值的類型應(yīng)該是能夠被迭代的,包括:字符串類型、數(shù)組類型、數(shù)組的指針類型、切片類型、字典類型和通道類型。例如:
for i, v := range "Go語言" { fmt.Printf("%d: %c\n", i, v) }
對(duì)于字符串類型的被迭代值來說,for
語句每次會(huì)迭代出兩個(gè)值。第一個(gè)值代表第二個(gè)值在字符串中的索引,而第二個(gè)值則代表該字符串中的某一個(gè)字符。迭代是以索引遞增的順序進(jìn)行的。例如,上面的for
語句被執(zhí)行后會(huì)在標(biāo)準(zhǔn)輸出上打印出:
0: G 1: o 2: 語 5: 言
可以看到,這里迭代出的索引值并不是連續(xù)的。下面我們簡(jiǎn)單剖析一下此表象的本質(zhì)。我們知道,字符串的底層是以字節(jié)數(shù)組的形式存儲(chǔ)的。而在Go語言中,字符串到字節(jié)數(shù)組的轉(zhuǎn)換是通過對(duì)其中的每個(gè)字符進(jìn)行UTF-8編碼來完成的。字符串"Go語言"
中的每一個(gè)字符與相應(yīng)的字節(jié)數(shù)組之間的對(duì)應(yīng)關(guān)系如下:
注意,一個(gè)中文字符在經(jīng)過UTF-8編碼之后會(huì)表現(xiàn)為三個(gè)字節(jié)。所以,我們用語[0]、語[1]和、語[2]分別表示字符'語'
經(jīng)編碼后的第一、二、三個(gè)字節(jié)。對(duì)于字符'言'
,我們?nèi)绶ㄅ谥啤?/span>
對(duì)照這張表格,我們就能夠解釋上面那條for
語句打印出的內(nèi)容了,即:每次迭代出的第一個(gè)值所代表的是第二個(gè)字符值經(jīng)編碼后的第一個(gè)字節(jié)在該字符串經(jīng)編碼后的字節(jié)數(shù)組中的索引值。請(qǐng)大家真正理解這句話的含義。
對(duì)于數(shù)組值、數(shù)組的指針值和切片之來說,range
子句每次也會(huì)迭代出兩個(gè)值。其中,第一個(gè)值會(huì)是第二個(gè)值在被迭代值中的索引,而第二個(gè)值則是被迭代值中的某一個(gè)元素。同樣的,迭代是以索引遞增的順序進(jìn)行的。
對(duì)于字典值來說,range
子句每次仍然會(huì)迭代出兩個(gè)值。顯然,第一個(gè)值是字典中的某一個(gè)鍵,而第二個(gè)值則是該鍵對(duì)應(yīng)的那個(gè)值。注意,對(duì)字典值上的迭代,Go語言是不保證其順序的。
攜帶range
子句的for
語句還可以應(yīng)用于一個(gè)通道值之上。其作用是不斷地從該通道值中接收數(shù)據(jù),不過每次只會(huì)接收一個(gè)值。注意,如果通道值中沒有數(shù)據(jù),那么for
語句的執(zhí)行會(huì)處于阻塞狀態(tài)。無論怎樣,這樣的循環(huán)會(huì)一直進(jìn)行下去。直至該通道值被關(guān)閉,for
語句的執(zhí)行才會(huì)結(jié)束。
最后,我們來說一下break
語句和continue
語句。它們都可以被放置在for
語句的代碼塊中。前者被執(zhí)行時(shí)會(huì)使其所屬的for
語句的執(zhí)行立即結(jié)束,而后者被執(zhí)行時(shí)會(huì)使當(dāng)次迭代被中止(當(dāng)次迭代的后續(xù)語句會(huì)被忽略)而直接進(jìn)入到下一次迭代。
請(qǐng)把命令源碼文件index.go的第 9 行寫一條for
語句,使該文件被執(zhí)行時(shí)會(huì)在標(biāo)準(zhǔn)輸出上打印出:
1: Golang 2: Java 3: Python 4: C
該條for
語句可以是:
for _, v := range []int{1, 2, 3, 4} { fmt.Printf("%d: %s\n", v, map1[v]) }
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)