Go语言中的range

在Go语言中,range 是一个用于遍历各种数据结构(如数组、切片、字符串、map 和通道)的关键字。range 可以返回一个索引和值,或者是键和值,具体取决于你遍历的是什么类型的数据结构。

1. range 的用法

range 常用于 for 循环,来遍历集合中的元素。它可以遍历数组、切片、字符串、map、甚至是 channel(通道)。每次迭代,range 会返回两个值:第一个值是索引或键,第二个值是元素本身。

基本语法:

for index, value := range collection {
    // 使用 index 和 value
}

如果你不需要索引或键,可以使用下划线 _ 来忽略它们。

2. range 遍历数组和切片

使用 range 遍历数组和切片时,返回的第一个值是索引,第二个值是数组或切片中对应索引位置的元素值

示例:

package main

import "fmt"

func main() {
    nums := []int{2, 3, 4}
    
    for index, value := range nums {
        fmt.Printf("Index: %d, Value: %d\n", index, value)
    }
}

输出:

Index: 0, Value: 2
Index: 1, Value: 3
Index: 2, Value: 4

如果你只关心数组或切片中的值,可以忽略索引:

for _, value := range nums {
    fmt.Println(value)
}

3. range 遍历字符串

遍历字符串时,range 返回的是每个字符的索引Unicode代码点(rune)

示例:

package main

import "fmt"

func main() {
    str := "hello"
    
    for index, char := range str {
        fmt.Printf("Index: %d, Character: %c\n", index, char)
    }
}

输出:

Index: 0, Character: h
Index: 1, Character: e
Index: 2, Character: l
Index: 3, Character: l
Index: 4, Character: o

4. range 遍历 map

遍历 map 时,range 返回的第一个值是,第二个值是键对应的值

示例:

package main

import "fmt"

func main() {
    fruits := map[string]string{"a": "apple", "b": "banana"}
    
    for key, value := range fruits {
        fmt.Printf("Key: %s, Value: %s\n", key, value)
    }
}

输出:

Key: a, Value: apple
Key: b, Value: banana

5. range 遍历通道(channel)

range 也可以用于遍历通道,前提是该通道是关闭的,否则它会一直阻塞等待新数据。range 会从通道中接收数据,直到通道被关闭。

示例:

package main

import "fmt"

func main() {
    ch := make(chan int, 2)
    ch <- 1
    ch <- 2
    close(ch)  // 关闭通道

    for value := range ch {
        fmt.Println(value)
    }
}

输出:

1
2

6. 忽略返回值

如果你只需要索引或键,或者只需要值,可以用下划线 _ 忽略不需要的部分。例如:

for _, value := range nums {  // 忽略索引,只关心值
    fmt.Println(value)
}

for index := range nums {  // 忽略值,只关心索引
    fmt.Println(index)
}

7. range 遍历多维数组

range 也可以用于遍历多维数组或切片。每次遍历返回的是子数组或子切片。

示例:

package main

import "fmt"

func main() {
    matrix := [][]int{
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9},
    }

    for _, row := range matrix {
        for _, value := range row {
            fmt.Printf("%d ", value)
        }
        fmt.Println()
    }
}

输出:

1 2 3 
4 5 6 
7 8 9 

8. 总结

  • range 是 Go 语言中用于遍历集合(数组、切片、map、字符串和通道)的关键字。
  • 它每次返回两个值:索引(或键)。你可以根据需要选择是否忽略某些返回值。
  • 通过 range,Go 提供了一种简单而强大的方式来遍历各种数据结构。
posted @ 2024-10-24 14:38  牛马chen  阅读(40)  评论(0编辑  收藏  举报