一起聊聊Go语言中的for循环

不知道各位看官对for循环了解多少,本文来和大家详细聊聊for相关的知识,介绍两个相关案例,希望能给大家带来帮助。


一起聊聊Go语言中的for循环


一起聊聊Go语言中的for循环


案例一:取地址符


我们在编写 for 语句时经常会出现运行和猜想的结果不一致。例如以下第一个案例的代码:


var all []*Itemfor _, item := range items {
    all = append(all, &item)
}


在 for 循环时,每次存入变量 all 的都是相同的 item,也就是最后一个循环的 item 值。


这是 Go 面试里经常出现的题目,如果想解决这个问题,就需要把程序改写成如下:


var all []*Itemfor _, item := range items {
    item := item
    all = append(all, &item)
}


要重新声明一个 item 变量把 for 循环的 item 变量给存储下来再追加进去。


案例二:闭包函数


接下来是第二个案例的代码:


var prints []func()for _, v := range []int{1, 2, 3} {
    prints = append(prints, func() { fmt.Println(v) })
}for _, print := range prints { print()
}


这段程序的输出结果是什么?没有 & 取地址符,是输出 1,2,3 吗?不是的。


输出结果是 3,3,3。问题的重点之一,关注到闭包函数,实际上所有闭包都打印的是相同的 v。输出 3,是因为在 for 循环结束后,最后 v 的值被设置为了 3,仅此而已。


如果想要达到预期的效果,依然是使用万能的再赋值。改写后的代码如下:


for _, v := range []int{1, 2, 3} {
        v := v
        prints = append(prints, func() { fmt.Println(v) })
    }


解决方案


在每个迭代变量 x 的每个循环体开头,加一个隐式的再赋值,也就是 x := x,就能够解决上述程序中所隐含的坑。


Go 1.30 或更高版本将会每次迭代变量,而早期 Go 版本的将每次循环变量,如此一来上述提到的 for 循环问题都会在一定范围内被解决。


以上就是本文的全部内容,翼速应用平台内有更多相关资讯,欢迎查阅!




我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题