新聞中心
通過前面的學(xué)習(xí)我們了解到切片其實(shí)就是多個(gè)相同類型元素的連續(xù)集合,既然切片是一個(gè)集合,那么我們就可以迭代其中的元素,Go語言有個(gè)特殊的關(guān)鍵字 range,它可以配合關(guān)鍵字 for 來迭代切片里的每一個(gè)元素,如下所示:

創(chuàng)新互聯(lián)成立于2013年,我們提供高端重慶網(wǎng)站建設(shè)公司、網(wǎng)站制作公司、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站定制、網(wǎng)絡(luò)營銷推廣、小程序設(shè)計(jì)、微信公眾號開發(fā)、網(wǎng)站推廣服務(wù),提供專業(yè)營銷思路、內(nèi)容策劃、視覺設(shè)計(jì)、程序開發(fā)來完成項(xiàng)目落地,為會所設(shè)計(jì)企業(yè)提供源源不斷的流量和訂單咨詢。
// 創(chuàng)建一個(gè)整型切片,并賦值
slice := []int{10, 20, 30, 40}
// 迭代每一個(gè)元素,并顯示其值
for index, value := range slice {
fmt.Printf("Index: %d Value: %d\n", index, value)
}第 4 行中的 index 和 value 分別用來接收 range 關(guān)鍵字返回的切片中每個(gè)元素的索引和值,這里的 index 和 value 不是固定的,讀者也可以定義成其它的名字。
關(guān)于 for 的詳細(xì)使用我們將在下一章《 Go語言流程控制》中為大家詳細(xì)介紹。
上面代碼的輸出結(jié)果為:
Index: 0 Value: 10
Index: 1 Value: 20
Index: 2 Value: 30
Index: 3 Value: 40
當(dāng)?shù)衅瑫r(shí),關(guān)鍵字 range 會返回兩個(gè)值,第一個(gè)值是當(dāng)前迭代到的索引位置,第二個(gè)值是該位置對應(yīng)元素值的一份副本,如下圖所示。
圖:使用 range 迭代切片會創(chuàng)建每個(gè)元素的副本
需要強(qiáng)調(diào)的是,range 返回的是每個(gè)元素的副本,而不是直接返回對該元素的引用,如下所示。
【示例 1】range 提供了每個(gè)元素的副本
// 創(chuàng)建一個(gè)整型切片,并賦值
slice := []int{10, 20, 30, 40}
// 迭代每個(gè)元素,并顯示值和地址
for index, value := range slice {
fmt.Printf("Value: %d Value-Addr: %X ElemAddr: %X\n", value, &value, &slice[index])
}輸出結(jié)果為:
Value: 10 Value-Addr: 10500168 ElemAddr: 1052E100
Value: 20 Value-Addr: 10500168 ElemAddr: 1052E104
Value: 30 Value-Addr: 10500168 ElemAddr: 1052E108
Value: 40 Value-Addr: 10500168 ElemAddr: 1052E10C
因?yàn)榈祷氐淖兞渴且粋€(gè)在迭代過程中根據(jù)切片依次賦值的新變量,所以 value 的地址總是相同的,要想獲取每個(gè)元素的地址,需要使用切片變量和索引值(例如上面代碼中的 &slice[index])。
如果不需要索引值,也可以使用下劃線
_來忽略這個(gè)值,代碼如下所示。
【示例 2】使用空白標(biāo)識符(下劃線)來忽略索引值
// 創(chuàng)建一個(gè)整型切片,并賦值
slice := []int{10, 20, 30, 40}
// 迭代每個(gè)元素,并顯示其值
for _, value := range slice {
fmt.Printf("Value: %d\n", value)
}輸出結(jié)果為:
Value: 10
Value: 20
Value: 30
Value: 40
關(guān)鍵字 range 總是會從切片頭部開始迭代。如果想對迭代做更多的控制,則可以使用傳統(tǒng)的 for 循環(huán),代碼如下所示。
【示例 3】使用傳統(tǒng)的 for 循環(huán)對切片進(jìn)行迭代
// 創(chuàng)建一個(gè)整型切片,并賦值
slice := []int{10, 20, 30, 40}
// 從第三個(gè)元素開始迭代每個(gè)元素
for index := 2; index < len(slice); index++ {
fmt.Printf("Index: %d Value: %d\n", index, slice[index])
}輸出結(jié)果為:
Index: 2 Value: 30
Index: 3 Value: 40
在前面幾節(jié)的學(xué)習(xí)中我們了解了兩個(gè)特殊的內(nèi)置函數(shù) len() 和 cap(),可以用于處理數(shù)組、切片和通道,對于切片,函數(shù) len() 可以返回切片的長度,函數(shù) cap() 可以返回切片的容量,在上面的示例中,使用到了函數(shù) len() 來控制循環(huán)迭代的次數(shù)。
當(dāng)然,range 關(guān)鍵字不僅僅可以用來遍歷切片,它還可以用來遍歷數(shù)組、字符串、map 或者通道等,這些我們將在后面的學(xué)習(xí)中詳細(xì)介紹。
分享名稱:創(chuàng)新互聯(lián)GO教程:Go語言range關(guān)鍵字:循環(huán)迭代切片
瀏覽地址:http://m.fisionsoft.com.cn/article/ccchioc.html


咨詢
建站咨詢
