Go语言遍历数组、切片、Map和Struct的完整指南

键盘旁的猫
键盘旁的猫
发布时间:2026-10-15| 4人浏览过
原创

掌握Go语言中不同数据结构的遍历方式是编程的基础。本文将深入解析如何使用for循环和range关键字处理数组、切片、字符串和Map,并展示如何利用reflect包对Struct进行动态字段遍历,提供清晰的代码示例与输出结果对照。

目标与准备条件

在Go语言(Golang)中,数据结构主要分为线性结构(如数组、切片)、映射结构(Map)以及组合结构(Struct)。遍历这些结构的核心目标是提取其中的值或键值对。需要确保开发环境已安装Go编译器,并能运行标准的package main程序。

第1步:使用For循环遍历数组与切片

目的:获取元素的索引和具体值,适用于需要知道当前位置的场景。
操作入口:主函数main()。
动作说明:初始化整型变量i为0,只要i小于集合长度len(),每次循环后递增i++。

package main

import (
	"fmt"
)

func main() {
	numbers := []int{7, 9, 1, 2, 4, 5}

	for i := 0; i < len(numbers); i++ {
		fmt.Println(numbers[i])
	}
}

该代码定义了一个整数切片numbers,并通过索引访问每个元素。输出结果为顺序排列的整数:
7
9
1
2
4
5

第2步:使用Range关键字简化迭代

目的:自动处理索引与值的分离,代码更简洁且易于阅读。
重要参数:index, value := range slice。
完成状态:成功打印索引与对应元素。

package main

import (
	"fmt"
)

func main() {
	arr := []string{"a", "b", "c", "d", "e", "f"}

	for index, a := range arr {
		fmt.Println(index, a)
	}
}

range关键字不仅适用于数组,还广泛用于字符串、Map等。若只需值而忽略索引,可将位置替换为下划线_:

package main

import (
	"fmt"
)

func main() {
	arr := []string{"a", "b", "c", "d", "e", "f"}

	for _, a := range arr {
		fmt.Println(a)
	}
}

第3步:遍历字符串中的字符

注意:Go中的字符串是UTF-8编码的字节序列。直接使用range遍历时,返回的是Unicode码点(rune),而非单个字节。

package main

import (
	"fmt"
)

func main() {
	word := "Ab$du"

	for index, r := range word {
		fmt.Println(index, string(r))
	}
}

如果直接打印r(未转换为string),将显示其ASCII码值(如'A'为65)。若需按字节遍历,可使用传统for循环配合len():

for i := 0; i < len(word); i++ {
	fmt.Printf("Byte %d: %c\n", i, byte(word[i]))
}

第4步:循环Map结构(键值对)

风险提醒:Map是无序的,遍历顺序不固定,不可依赖特定顺序。
操作动作:使用for key, val := range map。

package main

import (
	"fmt"
)

func main() {
	books := map[string]int{
		"maths":     5,
		"biology":   9,
		"chemistry": 6,
		"physics":   3,
	}
	for key, val := range books {
		fmt.Println(key, val)
	}
}

若只关心键,可省略第二个变量:for key := range books;若只关心值,使用for _, val := range books。

第5步:使用Reflect遍历Struct

目的:动态获取Struct所有字段的名称和值,常用于日志记录或通用序列化。
准备条件:导入"reflect"包。
动作说明:通过reflect.ValueOf()获取对象的可观察属性。

package main

import (
	"fmt"
	"reflect"
)

type Person struct {
	Name   string
	Age    int
	Gender string
	Single bool
}

func main() {
	ubay := Person{
		Name:   "John",
		Gender: "Female",
		Age:    17,
		Single: false,
	}
	values := reflect.ValueOf(ubay)
	types := values.Type()

	for i := 0; i < values.NumField(); i++ {
		fmt.Printf("Index: %d, Name: %s, Value: %v\n", 
			i, types.Field(i).Name, values.Field(i))
	}
}

此方法通过NumField()确定字段数量,再依次调用Field(i)获取索引、名称和实际值。相比手动硬编码,这种方式更具通用性。

简要总结

Go语言提供了灵活的迭代方式:for-range是处理数组、切片、Map的首选,兼顾简洁与安全;传统for循环在处理字节级操作或需复杂逻辑时依然必要;而对于Struct的动态遍历,reflect包提供了强大的元数据能力。理解各结构的特性(如Map无序、String UTF-8本质)有助于写出更高效、无Bug的代码。

以上就是Go语言循环数据结构(数组、Map、Struct等)的详细内容,更多关于Golang基础操作与高级技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。