Golang 语言 For 和 For-range 的区别

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

[[442133]]

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) 

输出结果:

  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) 

输出结果:

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

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

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

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

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

 

责任编辑:武晓燕 来源: Golang语言开发栈
相关推荐

2022-02-07 23:07:19

Golang语言Modules

2023-04-30 23:16:53

Go数组切片

2020-10-22 06:59:09

GolangRust语言

2023-11-29 07:47:29

Golang函数

2021-06-09 23:36:46

Golang语言版本

2023-03-29 08:03:53

2022-02-13 23:10:46

Golang语言变量

2021-06-07 23:19:44

Golang语言 Defer

2021-04-28 09:02:48

Golang语言Context

2010-03-17 18:38:53

Java编程语言

2022-07-01 11:56:54

C语言C++编程语言

2021-09-13 05:02:49

GogRPC语言

2022-10-27 19:32:20

切片golang数组

2021-05-28 05:34:06

Golang语言编程

2023-03-24 08:01:27

Go语言内存

2009-04-30 15:15:01

Java抽象类接口

2022-07-28 12:17:36

C语言typedef#define

2022-08-30 22:21:41

gotop监视器图形

2021-06-29 23:40:19

Golang语言并发

2021-09-26 10:20:06

开发Golang代码
点赞
收藏

51CTO技术栈公众号