Go语言的中的For循环之大坑

开发 后端
For循环在我们日常编码中可能用的很多。在很多业务场景中我们都需要用for循环处理。但golang中的for循环有一个大大大的坑,大家可否遇到。

 [[279459]]

For循环在我们日常编码中可能用的很多。在很多业务场景中我们都需要用for循环处理。但golang中的for循环有一个大大大的坑,大家可否遇到。直接上代码:

 

go语言的中的for循环之大坑

我们写一个测试类,定义一个切片数组,然后循环迭代每个元素,将元素的值放到另一个切片。循环finalArrays的时候按照我们的预期应该输出1、2、3、4。但事与愿违,输出的结果如下图:

go语言的中的for循环之大坑

懵逼了吧!为什么会出现这种奇怪的现象呢?这就是golang的循环变量的作用域导致的。

在golang的for循环中,循环内部创建的函数变量都是共享同一块内存地址,for循环总是使用同一块内存去接收循环中的的value变量的值。不管循环多少次,value的内存地址都是相同的。事实确实如此,我们输出value的内存地址看下:

go语言的中的for循环之大坑

所以,可以看到,整个4次循环过程中,所有变量值都是在0xc0000b8780这个地址上迭代的。4次循环都指向的是同一块内存地址,最后一次赋值的操作变量的值是4,指向了这块内存地址,所以前三次的值都变成了4。那我们怎么优化呢?我们只需要定义临时变量。

go语言的中的for循环之大坑

我们定义一个临时变量tmp,将value的值赋给tmp,问题就解决了。

评论中很多同学说,例子不足以说明这个问题,我这里写一段我们实际业务场景的代码,大家看看。

go语言的中的for循环之大坑

Bid结构体中的属性我就不贴图了。这种情况很多新手同学会犯,尤其是从java转go的同学。

责任编辑:华轩 来源: 今日头条
相关推荐

2014-09-01 09:57:11

Go产品环境最佳语言

2012-10-08 09:25:59

GoGo语言开发语言

2023-09-25 08:08:56

CAA开发者团队

2023-12-13 07:19:01

微服务架构Golang

2023-12-30 10:22:57

Go语言函数开发

2014-10-31 09:48:36

Go语言

2014-01-14 09:10:53

GoHTTP内存泄漏

2018-07-06 15:04:24

缓存token线程

2024-08-09 10:59:01

KubernetesSidecar模式

2021-07-15 23:18:48

Go语言并发

2022-02-09 16:02:26

Go 语言ArraySlice

2013-05-28 09:43:38

GoGo语言并发模式

2024-04-07 11:33:02

Go逃逸分析

2019-02-11 08:32:22

编程语言Go

2021-04-07 09:02:49

Go 语言变量与常量

2021-04-13 07:58:42

Go语言函数

2023-12-21 07:09:32

Go语言任务

2011-01-05 10:58:05

Google Go

2023-06-26 00:03:55

Go语言类型

2021-07-30 07:28:15

WorkerPoolGo语言
点赞
收藏

51CTO技术栈公众号