ZetCode

Golang range 关键字

最后修改于 2025 年 5 月 7 日

本教程将介绍如何在 Go 中使用 range 关键字。我们将通过实际的集合遍历示例来涵盖迭代基础知识。

range 关键字提供对数组、切片、映射、字符串和通道的迭代。它为有序集合返回索引/值对。

在 Go 中,range 简化了处理集合时的循环语法。它自动处理迭代逻辑,使代码更简洁、更安全。

基本的切片 range 遍历

range 最简单的用法是遍历切片。此示例显示了如何访问索引和值。

basic_range.go
package main

import "fmt"

func main() {
    fruits := []string{"apple", "banana", "cherry"}
    
    for index, fruit := range fruits {
        fmt.Printf("Index: %d, Value: %s\n", index, fruit)
    }
}

循环遍历切片,将索引分配给 index,将值分配给 fruit。Range 会自动处理迭代边界。

映射的 range 遍历

range 通过返回键/值对来处理映射。此示例演示了如何遍历映射的条目。

map_range.go
package main

import "fmt"

func main() {
    ages := map[string]int{
        "Alice": 25,
        "Bob":   30,
        "Carol": 28,
    }
    
    for name, age := range ages {
        fmt.Printf("%s is %d years old\n", name, age)
    }
}

映射的迭代顺序不保证。每次运行都可能产生不同的输出顺序。Range 简化了映射的遍历语法。

忽略索引或值

您可以使用 _ 忽略索引或值。此示例展示了这两种情况。

ignore_range.go
package main

import "fmt"

func main() {
    numbers := []int{10, 20, 30, 40, 50}
    
    // Ignore index
    for _, value := range numbers {
        fmt.Println(value)
    }
    
    // Ignore value
    for index := range numbers {
        fmt.Println(index)
    }
}

下划线 _ 用于丢弃不需要的值。当您只需要对中的一部分时,这可以使代码更简洁。

字符串的 range 遍历

当对字符串进行 range 遍历时,Go 会迭代 Unicode 码点。此示例演示了字符迭代。

string_range.go
package main

import "fmt"

func main() {
    greeting := "Hello, 世界"
    
    for index, runeValue := range greeting {
        fmt.Printf("Index: %d, Rune: %c\n", index, runeValue)
    }
}

循环单独处理每个 Unicode 字符。请注意,某些字符在 UTF-8 编码中可能占用多个字节。

通道的 range 遍历

range 可以迭代通道值,直到通道关闭。此示例显示了通道迭代。

channel_range.go
package main

import "fmt"

func main() {
    ch := make(chan string, 2)
    ch <- "first"
    ch <- "second"
    close(ch)
    
    for value := range ch {
        fmt.Println(value)
    }
}

循环从通道读取,直到通道关闭。Range 通过自动处理关闭条件来简化通道的消耗。

数组指针的 range 遍历

当对数组指针进行 range 遍历时,Go 会自动对其进行解引用。此示例演示了此行为。

pointer_range.go
package main

import "fmt"

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

指针 ptr 在迭代期间会自动解引用。这使得使用数组指针更加方便。

实际示例:求和

这个实际示例演示了如何使用 range 计算切片中值的总和。

sum_range.go
package main

import "fmt"

func main() {
    numbers := []int{5, 10, 15, 20, 25}
    sum := 0
    
    for _, num := range numbers {
        sum += num
    }
    
    fmt.Printf("Sum: %d\n", sum)
}

循环使用 _ 忽略索引,并将值累加到 sum 中。Range 使迭代干净而简洁。

来源

Go 语言规范

本教程通过迭代不同集合类型的实际示例,介绍了 Go 中的 range 关键字。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 Golang 教程