Go for range中容易踩的坑有哪些


这篇文章主要介绍了Goforrange中容易踩的坑有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Goforrange中容易踩的坑有哪些文章都会有所收获,下面我们一起来看看免费云主机域名吧。先来到开胃菜,热热身~不出意料,输出结果为:李四=>李四
王五=>王五
张三=>张三这题比较简单,就是简单的传值操作,大家应该都能答上来。下面加大难度,改为传址操作将案例一改为传址操作好好想想应该输出什么结果呢?还是跟案例一是一样的结果吗?难道会有坑?不出意料,还是出了意外,输出结果为:张三=>王五
李四=>王五
王五=>王五为什么呢?首先,关键点在于Go的for循环,对循环变量stu每次是循环并不是迭代(简单的说,就是对循环变量stu只会做一次声明和内存地址的分配,后面循环就是不断更新值);所以,取址操作&stu,其实都是取的同一个变量的地址,只是值被循环更新为最后一个元素的值;最终,输出的v.name,都是最后一个元素的name为王五解决方案:在for循环中,做同名变量覆盖stu:=stu(即重新声明一个局部变量,做值拷贝,避免相互影响)输出结果:张三=>张三
李四=>李四
王五=>王五在for循环里,做闭包操作,也是很容易掉坑的。看看下面输出什么?一眼看过去,感觉是输出1 2 3,但实际会输出 3 3 3为什么呢?首先,在分析了案例二后,我们知道了Go的for循环对循环变量v,其实每次是循环并不是迭代;然后,闭包=函数+引用环境,在同一个引用环境下,循环变量v的值会被不断的覆盖;所以最终,在打印时,输出的v,都是最后一个值3。解决方案:和案例二解决方案一样,是在for循环中,做同名变量覆盖v:=v输出结果:1
2
3在for循环里,起goroutine协程,也是很迷惑很容易掉坑的。看看下面输出什么?一眼看过去,感觉是会无序输出1 2 3 4 5,但实际会输出 5 5 5 5 5为什么呢?首先,要记得Go的for循环对循环变量str,其实每次是循环并不是迭代;然后,main协程会和新起的协程做相互博弈,看谁执行更快,按这个案例执行情况来看,main协程执行速度明显比新起的协程会更快,所以str被更新为最后一个元素值5(备注:并非绝对);最终,在新起的协程中,使用str时值都为5,作为结果去输出;拓展:如果在新起协程前,sleep个5s,输出结果又会截然不同,感兴趣的同学可以自行实验下,然后逐步深入地了解下GMP调度机制解决方案:和前面两个案例解决方案一样,是在for循环中,做同名变量覆盖str:=str输出结果:5
4
2
1
3注意是1~5无序输出关于“Goforrange中容易踩的坑有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Goforrange中容易踩的坑有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。

相关推荐: C#怎么动态创建lambda表达式

这篇文章主要讲解了“C#怎么动态创建lambda表达式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着免费云主机域名小编的思路慢慢深入,一起来研究和学习“C#怎么动态创建lambda表达式”吧!代码如下:网上还看到一种简单的多条件查询的方法,相当于用…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/26 22:11
下一篇 05/26 22:13

相关推荐