1. 程式人生 > GO語言入門 >29 Go 語言中的 range

29 Go 語言中的 range

線上程不安全的 map 中我們學習了 map 的遍歷,裡面使用了一個叫 range 的關鍵字來對 map 進行遍歷操作。當時還提到了切片和陣列都可以使用這個方法遍歷。本文就來詳細學習一下 range 關鍵字的用法。

Tips:本文提及的 map 均是執行緒不安全的 map。執行緒安全的 map 及其遍歷方法參照 Go 語言中的map 一文。

1. 基本用法

range 可以用來遍歷的物件有陣列、切片、map、字串以及通道。遍歷的物件不同,range 的返回值也會有所不同。遍歷陣列、切片和字串時,它返回的就是資料的索引和值。遍歷map時返回的就是map的key和value。而遍歷通道時則只返回通道中的資料

程式碼示例:

package main

import (
    "fmt"
)

func main() {
    str := "Codey"
    intArray := [5]int{1, 2, 3, 4, 5}
    intSlice := []int{1, 2, 3, 4, 5}
    m := map[string]string{"Apple": "蘋果", "Orange": "橘子", "Banana": "香蕉"}
    c := make(chan int, 10)
    c <- 10
    c <- 11
    c <- 12
    c <-
13 c <- 14 fmt.Println("---字串的遍歷---") //遍歷字串 for k, v := range str { fmt.Printf("索引:%d,值:%c\n", k, v) } fmt.Println("---陣列的遍歷---") //遍歷陣列 for k, v := range intArray { fmt.Printf("索引:%d,值:%d\n", k, v) } fmt.Println("---切片的遍歷---") //遍歷切片 for
k, v := range intSlice { fmt.Printf("索引:%d,值:%d\n", k, v) } fmt.Println("---map的遍歷---") //遍歷map for k, v := range m { fmt.Printf("key:%s,value:%s\n", k, v) } fmt.Println("---通道的遍歷---") //遍歷通道 for v := range c { fmt.Printf("值:%d\n", v) if len(c) == 0 { break } } }

執行結果:

圖片描述

若是在開發過程中只想用到遍歷物件的索引或者值,比如說一個map以汽車的車牌號為key儲存了一些汽車的資訊,但是你只想要操作車牌號。可以使用_來接收不需要使用的值。如果是隻想用索引的話,可以直接只用一個引數接收遍歷物件傳出的值,預設只會接收索引

程式碼示例:

package main

import (
    "fmt"
)

func main() {

    m := map[string]string{"Apple": "蘋果", "Orange": "橘子", "Banana": "香蕉"}
    fmt.Println("---map的key值---")
    //只取key
    for k := range m {
        fmt.Printf("key:%s\n", k)
    }
    fmt.Println("---map的value值---")
    //只取value
    for _, v := range m {
        fmt.Printf("value:%s\n", v)
    }
}

執行結果:

圖片描述

2. 注意事項

在使用 range 的時候需要注意,我們無法通過range輸出的值來修改遍歷的物件,因為range相當於聲明瞭兩個變數,這兩個變數逐一複製了遍歷物件中的值,歸根結底還是因為 Go 語言只有值傳遞,沒有引用傳遞

程式碼示例:

package main

import (
    "fmt"
)

func main() {

    intSlice := []int{1, 2, 3, 4, 5}

    //遍歷切片
    for k, v := range intSlice {
        fmt.Printf("索引:%d,索引地址:%p\n", k, &k)
        fmt.Printf("值:%d,值地址:%p\n", v, &v)
    }
}

執行結果:

圖片描述

3. 小結

本文主要介紹了 Go 語言中 range 關鍵字的用法,Go語言中可以 range 的物件有:字串、陣列、切片、map 和通道。其中用於接收 range 出來的值的變數是一個/兩個不斷被賦值的變數,所以這些變數的修改無法影響到正在被遍歷的物件本身。