Go语言范围Range

news/2024/10/17 10:17:27/

1、Go语言范围Range

Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数

组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。

// 格式如下
// 代码中的key和value是可以省略的
for key, value := range oldMap {newMap[key] = value
}
// 如果只想读取key,格式如下
for key := range oldMap
// 或者
for key, _ := range oldMap
// 如果只想读取value,格式如下
for _, value := range oldMap
// 遍历简单的数组,2**%d的结果为索引对应的次方数
package mainimport "fmt"var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}func main() {/*2**0 = 12**1 = 22**2 = 42**3 = 82**4 = 162**5 = 322**6 = 642**7 = 128*/for i, v := range pow {fmt.Printf("2**%d = %d\n", i, v)}
}
# 程序输出
2**0 = 1
2**1 = 2
2**2 = 4
2**3 = 8
2**4 = 16
2**5 = 32
2**6 = 64
2**7 = 128
// for循环的range格式可以省略key和value
package mainimport "fmt"func main() {map1 := make(map[int]float32)map1[1] = 1.0map1[2] = 2.0map1[3] = 3.0map1[4] = 4.0/*key is: 1 - value is: 1.000000key is: 2 - value is: 2.000000key is: 3 - value is: 3.000000key is: 4 - value is: 4.000000*/// 读取 key 和 valuefor key, value := range map1 {fmt.Printf("key is: %d - value is: %f\n", key, value)}/*key is: 1key is: 2key is: 3key is: 4*/// 读取 keyfor key := range map1 {fmt.Printf("key is: %d\n", key)}/*value is: 1.000000value is: 2.000000value is: 3.000000value is: 4.000000*/// 读取 valuefor _, value := range map1 {fmt.Printf("value is: %f\n", value)}
}
// range遍历其他数据结构
package mainimport "fmt"func main() {//这是我们使用 range 去求一个 slice 的和。使用数组跟这个很类似nums := []int{2, 3, 4}sum := 0for _, num := range nums {sum += num}// sum: 9fmt.Println("sum:", sum)//在数组上使用 range 将传入索引和值两个变量。上面那个例子我们不需要使用该元素的序号,所以我们使用空白符"_"省略了。有时侯我们确实需要知道它的索引。for i, num := range nums {if num == 3 {// index: 1fmt.Println("index:", i)}}//range 也可以用在 map 的键值对上。kvs := map[string]string{"a": "apple", "b": "banana"}/*a -> appleb -> banana*/for k, v := range kvs {fmt.Printf("%s -> %s\n", k, v)}/*0 1031 111*///range也可以用来枚举 Unicode 字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。for i, c := range "go" {fmt.Println(i, c)}
}
// Range 简单循环
package mainimport "fmt"func main() {nums := []int{1, 2, 3, 4}length := 0for range nums {length++}// 4fmt.Println(length)
}
// 通过 range 获取参数列表
package mainimport ("fmt""os"
)func main() {// 1fmt.Println(len(os.Args))for _, arg := range os.Args {// C:\Users\zhangshixing\AppData\Local\Temp\___go_build_hello_go.exefmt.Println(arg)}
}
// Go 中的中文采用UTF-8编码,因此逐个遍历字符时必须采用for-each形式
package mainimport "fmt"func main() {// str: hello// 0x68 h, 0x65 e, 0x6c l, 0x6c l, 0x6f o,// 0x68, 0x65, 0x6c, 0x6c, 0x6f,printStr("hello")fmt.Println()fmt.Println()// str: 中国人// 0x4e2d 中, 0x56fd 国, 0x4eba 人,// 0xe4, 0xb8, 0xad, 0xe5, 0x9b, 0xbd, 0xe4, 0xba, 0xba,printStr("中国人")
}func printStr(s string) {fmt.Println("str: " + s)for _, v := range s {fmt.Printf("0x%x %c, ", v, v)}fmt.Println()for i := 0; i < len(s); i++ {fmt.Printf("0x%x, ", s[i])}
}

涉及指针时需要注意,v 是个单独的地址:

package mainimport "fmt"func main() {nums := [3]int{5, 6, 7}/*源值地址: 0xc00000c108          value的地址: 0xc000016098源值地址: 0xc00000c110          value的地址: 0xc000016098源值地址: 0xc00000c118          value的地址: 0xc000016098*/for k, v := range nums {fmt.Println("源值地址:", &nums[k], " \t value的地址:", &v)}
}

range复用临时变量:

package mainimport "sync"func main() {wg := sync.WaitGroup{}si := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}for i := range si {wg.Add(1)go func() {print(i)wg.Done()}()}wg.Wait()
}
# 程序输出
9999999999

导致这样结果的原因是:

(1)、for range 下的迭代变量i的值是共用的。

(2)、main函数所在的 goroutine 和后续启动的 goroutines 存在竞争关系。

package mainimport "sync"func main() {wg := sync.WaitGroup{}si := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}for i := range si {wg.Add(1)// 这里有一个实参到形参的值拷贝go func(a int) {print(a)wg.Done()}(i)}wg.Wait()
}
# 程序输出
9865207314

http://www.ppmy.cn/news/589354.html

相关文章

Android SPI

1.SPI SPI全称Service Provider Interface&#xff0c;服务提供方接口&#xff0c;是Java提供的一套用来被第三方实现或者扩展的API&#xff0c;它可以用来启用框架扩展和替换组件。服务通常指一个接口或者一个抽象类&#xff0c;服务提供方是对这个接口或者抽象类的具体实现&…

关于数据分析中NumPy,Pandas,看完这一篇基本够了

前言 数据分析是Python的重要应用领域之一&#xff1a;Python在数据分析领域有着广泛的应用&#xff0c;许多数据科学家和分析师使用Python作为主要的数据分析工具。学好数据分析可以让你更好地应用Python来解决实际问题&#xff0c;并提升在数据分析领域的竞争力。 在当今信…

Android下磁盘分区表损坏,硬盘分区表修复,教您硬盘分区表损坏怎么修复

电脑使用的时间长&#xff0c;硬盘就会出现损坏的情况&#xff0c;因为病毒、当机等经常会破坏硬盘分区表&#xff0c;一旦分区表遭到破坏&#xff0c;就会导致磁盘丢失等硬盘故障&#xff0c;那就得不偿失了&#xff0c;怎么解决&#xff1f;下面&#xff0c;小编给大家带来了…

修复计算机之后东西还在吗,硬盘分区表修复后文件还在吗

191路由网导读&#xff1a;原标题&#xff1a;"硬盘分区表修复,详细教您如何修复硬盘分区表"最新电脑问题教程分享。 - 来源:191路由网 - 编辑:爱装机。 人们在使用电脑时&#xff0c;有时由于异常操作&#xff0c;有时由于病毒侵袭&#xff0c;会导致某个分区消失或…

Android下磁盘分区表损坏,修复分区表,教您硬盘分区表损坏怎么修复

有用户询问硬盘分区表出现损坏怎么办&#xff1f;这里有一个快速简单的办法&#xff0c;可以把丢失的文件恢复&#xff0c;下面跟大家介绍一下操作。磁盘分区虽然不是那么容易损坏&#xff0c;但也不是安全可靠的。有时候磁盘损坏&#xff0c;就会有很多重要的文件会丢失&#…

硬盘分区故障修复全攻略

发布日期: 2004-9-7 18:49:31 作者: 文/藏陋网 字体:【大 中 小】【打印本页】 国产二维CAD新标准 彩信/短信开发平台 免费测试您的IT潜质! 美萍洗浴、餐饮管理系统 由于分区故障&#xff0c;很有可能开启计算机时无法进入熟悉的Windows界面&#xff0c;甚至通过系统启动盘…

如何修复损坏的硬盘分区

今天杯具了。昨天为了装一个新游戏&#xff0c;在 WIndows 7 下面新建了一个分区。结果今天开机发现 GRUB 进不去了。 手头上没有 Ubuntu 的系统盘&#xff0c;于是用一个什么分区修复工具搞了一下。结果所有的分区都被干掉了&#xff0c;PartitionMagic 显示硬盘未分区。 没…

硬盘分区表错误导致的问题和解决过程

两个月前装了WIN10预览版(双系统)尝鲜,可能由于卸载方式不正确或者不完全, 导致我的笔记本(WIN8.1 64bit)出现了一个很费解的问题 在断网的情况下则完全没什么, 而一旦联网(插上网线或者连WIFI)之后就崩溃了, 表现为资源管理器不间断关闭重启, 而且无法打开任何应用程序, 不断…