脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Golang 语言 For 和 For-range 的区别

Golang 语言 For 和 For-range 的区别

2021-12-28 00:46Golang语言开发栈frank Golang

在 Golang 语言中,仅有 for 一种循环语句,但是可以模拟 while (condition) {} 和 while (true) {}。除此之外,Golang 语言还引入了另外一个关键字 range,我们也可以配合 for 关键字,使用 for-range循环遍历数据。

Golang 语言 For 和 For-range 的区别

1介绍

在 Golang 语言中,仅有 for 一种循环语句,但是可以模拟 while (condition) {} 和 while (true) {}。

除此之外,Golang 语言还引入了另外一个关键字 range,我们也可以配合 for 关键字,使用 for-range循环遍历数据。

本文我们介绍一下使用 for 和 for-range 循环遍历数据的区别。

2区别

在 Golang 语言程序开发中,经常会使用循环遍历数据,因为 Golang 语言提供了 for-range 范围遍历,可以更加方便的帮助我们循环遍历数据,比如数据和数组指针、切片、字符串、映射和通道,所以我们比较喜欢使用 for-range 范围遍历替代 for 普通遍历。

实际上,使用范围遍历 for-range 和使用普通遍历 for 是有区别的,因为范围遍历会在遍历之前,先拷贝一份被遍历的数据,然后遍历拷贝的数据。

3踩「坑」

在 Golang 语言程序开发中,因为不了解使用范围遍历切片和使用普通遍历切片的区别,新手经常会在此踩“坑”。

范围遍历切片

  1. func main() {
  2. s := []int{0, 1}
  3. for _, v := range s {
  4. s = append(s, v)
  5. }
  6. fmt.Printf("s=%v\n", s)
  7. }

输出结果:

  1. s=[0 1 0 1]

普通遍历切片

  1. func main() {
  2. s := []int{0, 1}
  3. for i := 0; i < len(s); i++ {
  4. s = append(s, s[i])
  5. }
  6. fmt.Printf("s=%v\n", s)
  7. }

输出结果:

阅读上面这段代码,我们分别使用范围遍历和普通遍历,循环遍历同一个切片。范围遍历可以输出结果,而普通遍历是无限循环,无法输出结果。

原因是范围遍历在开始遍历数据之前,会先拷贝一份被遍历的数据,所以在遍历过程中去修改被遍历的数据,只是修改拷贝的数据,不会影响到原数据。

在该示例代码中,我们在循环过程中,不断追加数据到切片,原以为范围遍历也可以像普通遍历那样,无限循环,但是实际上结果并非所想。

同时,因为范围遍历会拷贝被遍历数据,所以在需要遍历内存占用比较大的数组时,建议使用普通遍历,如果必须使用范围遍历,我们可以遍历数组的地址或先将数组转换为切片,然后再遍历。

4总结

本文我们介绍了在 Golang 语言中,循环遍历数据的两种方式之间有什么区别,其中最大的区别,也是最容易踩“坑”的地方,就是范围遍历会在遍历之前,先拷贝一份被遍历的数据,然后遍历拷贝的数据。

如果读者朋友们不清楚这个区别,在程序开发中,肯定会遇到这样或那样的“坑”,而且还很难发现和绕过。

除了文中列举的示例,相信读者朋友们肯定还有很多其他踩“坑”场景,欢迎在留言区与大家分享。

参考资料:

https://gobyexample.com/range

https://go.dev/tour/moretypes/16

https://go.dev/ref/spec#For_statements

https://www.geeksforgeeks.org/range-keyword-in-golang/

https://golangbyexample.com/understand-for-range-loop-golang/

https://www.educative.io/edpresso/what-is-the-for-range-loop-in-golang

原文地址:https://mp.weixin.qq.com/s/z-0Sff8r3n5TPjVXG_MIeQ

延伸 · 阅读

精彩推荐
  • GolangGo语言range关键字循环时的坑

    Go语言range关键字循环时的坑

    今天小编就为大家分享一篇关于Go语言range关键字循环时的坑,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来...

    benben_20154202020-05-23
  • GolangGo语言基础单元测试与性能测试示例详解

    Go语言基础单元测试与性能测试示例详解

    这篇文章主要为大家介绍了Go语言基础单元测试与性能测试示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步...

    枫少文7812021-12-05
  • GolangGolang 语言极简类型转换库cast的使用详解

    Golang 语言极简类型转换库cast的使用详解

    本文我们通过 cast.ToString() 函数的使用,简单介绍了cast 的使用方法,除此之外,它还支持很多其他类型,在这没有多多介绍,对Golang 类型转换库 cast相关知...

    Golang语言开发栈6112021-12-02
  • GolangGO语言字符串处理Strings包的函数使用示例讲解

    GO语言字符串处理Strings包的函数使用示例讲解

    这篇文章主要为大家介绍了GO语言字符串处理Strings包的函数使用示例讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加...

    Jeff的技术栈6882022-04-14
  • GolangGo语言实现自动填写古诗词实例代码

    Go语言实现自动填写古诗词实例代码

    这篇文章主要给大家介绍了关于Go语言实现自动填写古诗词的相关资料,这是最近在项目中遇到的一个需求,文中通过示例代码介绍的非常详细,需要的朋...

    FengY5862020-05-14
  • Golang深入浅析Go中三个点(...)用法

    深入浅析Go中三个点(...)用法

    这篇文章主要介绍了深入浅析Go中三个点(...)用法,需要的朋友可以参考下...

    踏雪无痕SS6472021-11-17
  • GolangGolang实现四种负载均衡的算法(随机,轮询等)

    Golang实现四种负载均衡的算法(随机,轮询等)

    本文介绍了示例介绍了Golang 负载均衡的四种实现,主要包括了随机,轮询,加权轮询负载,一致性hash,感兴趣的小伙伴们可以参考一下...

    Gundy_8442021-08-09
  • Golanggo语言获取系统盘符的方法

    go语言获取系统盘符的方法

    这篇文章主要介绍了go语言获取系统盘符的方法,涉及Go语言调用winapi获取系统硬件信息的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    无尽海3862020-04-24