Go語言有個特殊的關鍵字 range,它可以配合關鍵字 for 來迭代切片里的每一個元素。當迭代切片時,關鍵字 range 會返回兩個值,第一個值是當前迭代到的索引位置,第二個值是該位置對應元素值的一份副本,如下圖所示
需要強調的是,range 返回的是每個元素的副本,而不是直接返回對該元素的引用,如下所示
// 創建一個整型切片,並賦值 slice := []int{10, 20, 30} // 迭代每一個元素,並顯示其值 for k, v := range slice { fmt.Printf("index:%d value:%d value-addr:%X elemm-addr:%X \n", k, v, &v, &slice[k]) }
輸出結果為:
index:0 value:10 value-addr:C00000A0B0 elemm-addr:C000010340 index:1 value:20 value-addr:C00000A0B0 elemm-addr:C000010348 index:2 value:30 value-addr:C00000A0B0 elemm-addr:C000010350
因為迭代返回的變量是一個在迭代過程中根據切片依次賦值的新變量,所以 value 的地址總是相同的,要想獲取每個元素的地址,需要使用切片變量和索引值(例如上面代碼中的 &slice[k])。
當然,range 關鍵字不僅僅可以用來遍歷切片,它還可以用來遍歷數組、字符串、map 或者通道等。
package main import "fmt" func main() { // 創建一個整型切片,並賦值 slice := []int{10, 20, 30} // 迭代每一個元素,並顯示其值 for k, v := range slice { fmt.Printf("index:%d value:%d value-addr:%X elemm-addr:%X \n", k, v, &v, &slice[k]) } fmt.Println("\n使用空白標識符(下划線)來忽略索引值") //使用空白標識符(下划線)來忽略索引值 for _, v := range slice { fmt.Printf(" value:%d \n", v) } fmt.Println("\n使用傳統的 for 循環對切片進行迭代") //使用傳統的 for 循環對切片進行迭代 for i := 0; i < len(slice); i++ { fmt.Printf(" value:%d \n", slice[i]) } }
執行結果