如何理解Golang中的range语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解Golang中的range语句相关的知识,希望对你有一定的参考价值。

你把它理解为遍历么,结合for循环。

假设有一个初始化好的数组(table)或者切片(slice)的table,且table长度为10:

for i, value := range table 
    fmt.Printf("i=%v, value=%v\\n", i, value)

则会执行fmt.Printf10次,且这10次的【i】的值分别是从0~9,也就相当于

for i := 0; i < len(table); i++ 
    fmt.Printf("i=%v, value=%v\\n", i, table[i])

如果把上边的数组或者切片换成map

for key, value := range table 
    fmt.Pritnf("key=%v, value=%v\\n", key, value)

则类似上边的过程把map里边的key-value键值对一 一遍历

参考技术A 你也可以写成
fori := 0; i< 5; i++
fmt.Println("Value of i is now:", i)


range是一个statement,不是函数,和for一起使用,用于遍历slice,array,map,string或者channel。
range的返回值有俩,取决于遍历那种数据结构。
唯一注意的地方是,遍历map时,元素的顺序是随机的。其实这个特性可以用做自带的随机采样。

Golang✔️走进 Go 语言✔️ 第十三课 range & map

【Golang】✔️走进 Go 语言✔️ 第十三课 range & map

概述

Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 13 课)

Range

Go 语言中 range 关键字用于 for 循环中迭代数组, 切片, 通道或集合的元素. 在数组和切片中 range 会返回元素的索引和索引对应当值. 在集合中返回 key-value 对的 key 值.

格式:

for index, value := range 数组/切片/通道/集合 {
	循环体
}

例 1

例子:

package main

import "fmt"

func main() {

	// 创建切片
	var array = []int {1, 2, 3, 4}

	// range使用
	for index, value := range array {
		fmt.Println("index:", index, "value:", value)
	}
	
}

输出结果:

index: 0 value: 1
index: 1 value: 2
index: 2 value: 3
index: 3 value: 4

例 2

实现数组求和:

import "fmt"

func main() {

	// 创建数组
	var array = [5]int {1, 2, 3, 4}

	// 创建变量
	var sum = 0

	// range使用
	for _, value := range array {
		sum += value
	}

	// 调试输出数组和
	fmt.Print("数组之和: ", sum)

}

输出结果:

数组之和: 10

map

集合 (map) 是一种无序的键值对的集合. map 最重要的一点就是通过 key 来快速检索数据. key 类似于索引, 指向数据的值. map 是一种集合, 所以我们可以像迭代数组和切片那样迭代它. 不过 map 是无序的, 所以我们无法觉得它的返回顺序, 这是因为 map 是使用哈希表来实现的.

例 1

格式:

/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type

例子:

package main

import "fmt"

func main() {

	// 定义map
	var student_map = map[string]string{"学生1": "小白", "学生2": "中白", "学生3": "大白"}

	// 调试输出
	fmt.Println(student_map)

}

输出结果:

map[学生1:小白 学生2:中白 学生3:大白]

例 2

格式:

/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)

例子:

package main

import "fmt"

func main() {

	// 定义map
	var student_map = make(map[string]string)


	// map赋值
	student_map["学生1"] = "lalalallalalla"
	student_map["学生1"] = "小白"
	student_map["学生2"] = "中白"
	student_map["学生3"] = "大白"

	// 调试输出
	fmt.Println(student_map)

}

输出结果:

map[学生1:小白 学生2:中白 学生3:大白]

我们可以看到 “lalalalalalal” 并没有输出, 因为 map 的 key 和值是一一对应的.

例 3

判断元素是否存在:

package main

import "fmt"

func main() {

	// 创建map
	var student_map = make(map[string]string)

	// map赋值
	student_map["学生1"] = "小白"
	student_map["学生2"] = "中白"
	student_map["学生3"] = "大白"

	// 判断元素是否存在于map之内
	student, flag := student_map["学生3"]

	if flag {
		fmt.Println("元素存在", student)
	} else {
		fmt.Println("元素不存在", student)
	}

}

输出结果:

元素存在 大白

以上是关于如何理解Golang中的range语句的主要内容,如果未能解决你的问题,请参考以下文章

golang range for循环中如何正确的给goroutine传参

Golang基础教程

Golang入门到项目实战 golang中的if语句

Golang✔️走进 Go 语言✔️ 第十三课 range & map

Golang✔️走进 Go 语言✔️ 第十三课 range & map

Golang入门到项目实战 golang for循环语句