首页 > 服务端语言 > Go 入门教程 > 29 Go 语言中的 range

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 出来的值的变量是一个/两个不断被赋值的变量,所以这些变量的修改无法影响到正在被遍历的对象本身。

本文来自互联网用户投稿,不拥有所有权,该文观点仅代表作者本人,不代表本站立场。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。
© 2023 PV138 · 站点地图 · 免责声明 · 联系我们 · 问题反馈