广告
返回顶部
首页 > 资讯 > 精选 >Go语言中的for循环使用实例分析
  • 752
分享到

Go语言中的for循环使用实例分析

2023-07-04 13:07:31 752人浏览 独家记忆
摘要

这篇文章主要介绍“Go语言中的for循环使用实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言中的for循环使用实例分析”文章能帮助大家解决问题。问题案例一:取地址符在 Go 语言中,我

这篇文章主要介绍“Go语言中的for循环使用实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言中的for循环使用实例分析”文章能帮助大家解决问题。

问题

  • 案例一:取地址符

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

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

这段代码有问题吗?变量 all 内的 item 变量,存储进去的是什么? 是每次循环的 item 值吗?

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

这是 Go 面试里经常出现的题目,结合 goroutine 更风骚,毕竟还会存在乱序输出等问题。

如果你想解决这个问题,就需要把程序改写成如下:

var all []*Itemfor _, item := range items {item := itemall = 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 := vprints = append(prints, func() { fmt.Println(v) })}

增加 v := v 语句,程序输出结果为 1,2,3。仔细翻翻你写过的 Go 工程,是不是都很熟悉?就这改造方法,赢了。

尤其是配合上 Goroutine 的写法,很多同学会更容易在此翻车。

解决方案

  • 修复思路

实际上 Go 核心团队在内部和社区已经讨论过许久,希望重新定义 for 循环的语法。要达到的目的是:使循环变量每次迭代而不是每次循环

解决的办法是:在每个迭代变量 x 的每个循环体开头,加一个隐式的再赋值,也就是 x := x,就能够解决上述程序中所隐含的坑。和我们现在做的一样,只不过我们是自己手动加的,Go 团队做的是希望在编译器内隐式处理。

  • 让用户自己决定

比较尴尬的是 Go 团队在 Proposal: Go 2 transition 中禁止重新定义语言,所以 rsc 不能直接这么干。

因此将会由用户自己决定控制这个 “破坏”,方式将会是根据每个包的 go.mod 文件中的 go 行更改语义。

如果我们是在 Go1.30 对本文讨论的 for 循环改为迭代,那么在 go.mod 文件中的 go 版本声明是将是一个关键。

如下图示:

Go语言中的for循环使用实例分析

Go 1.30 或更高版本将会每次迭代变量,而早期 Go 版本的将每次循环变量。

如此一来上述提到的 for 循环问题都会在一定范围内被解决。

关于“Go语言中的for循环使用实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Go语言中的for循环使用实例分析

本文链接: https://www.lsjlt.com/news/345380.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言中的for循环使用实例分析
    这篇文章主要介绍“Go语言中的for循环使用实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言中的for循环使用实例分析”文章能帮助大家解决问题。问题案例一:取地址符在 Go 语言中,我...
    99+
    2023-07-04
  • Go语言中for循环的经典案例分析
    目录前言案例一:for+传值案例二:for+传址案例三:for+闭包案例四:for+goroutine总结前言 for循环问题,在面试中经常都会被问到,并且在实际业务项目中也经常用到...
    99+
    2023-02-09
    Go语言 for循环 Go for循环 Go for
  • Go语言中for循环语句怎么用
    这篇文章主要介绍了Go语言中for循环语句怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概述for循环是一个循环控制结构,可以执行指定次数的循环语法第一种for&nbs...
    99+
    2023-06-25
  • C语言中循环的示例分析
    这篇文章主要为大家展示了“C语言中循环的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中循环的示例分析”这篇文章吧。(壹)while语句1.1while的执行流程比如我们实现:在屏...
    99+
    2023-06-29
  • C语言循环与分支语句实例分析
    本篇内容主要讲解“C语言循环与分支语句实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言循环与分支语句实例分析”吧!写在开始0表示假,非0表示真。1. 分支语句分支语句也叫做条件选择语...
    99+
    2023-06-30
  • 详解Go语言中for循环,break和continue的使用
    目录基本语法有始有终的条件循环带条件的循环无限循环数组循环使用计数器循环利用range循环Map循环string的遍历Break和Continue基本语法 和C语言同源的语法格式,有...
    99+
    2022-11-13
  • Go语言中循环语句使用的示例详解
    目录一、概述1. 循环控制语句2. 无限循环二、Go 语言 for 循环1. 语法2. for语句执行过程3. 示例4. For-each range 循环三、循环嵌套1. 语法2....
    99+
    2022-11-13
  • python中for循环的示例分析
    这篇文章将为大家详细讲解有关python中for循环的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、遍历可迭代的对象。循环的本质是首先通过iter()函数获得可迭代对象Iterable的迭代器...
    99+
    2023-06-15
  • Go语言基础for循环语句的用法及示例详解
    目录概述语法注意示例一  死循环,读取文件示例二  打印乘法表示例三  遍历字符串,数组,map 概述 for循环是一个循环控制结构,可以执行指定次数的...
    99+
    2022-11-12
  • C语言分支与循环实例代码分析
    这篇文章主要介绍“C语言分支与循环实例代码分析”,在日常操作中,相信很多人在C语言分支与循环实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言分支与循环实例代码...
    99+
    2022-10-19
  • Python2与python3中 for 循环语句基础与实例分析
    下面的代码中python2与python3的print使用区别,大家注意一下。python3需要加()才行。 语法: for循环的语法格式如下: for iterating_var in sequenc...
    99+
    2022-06-04
    语句 实例 基础
  • C语言中for循环与while循环怎么使用
    本文小编为大家详细介绍“C语言中for循环与while循环怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言中for循环与while循环怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、单层f...
    99+
    2023-07-02
  • Go语言中interface语法与使用实例分析
    这篇“Go语言中interface语法与使用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言中interfac...
    99+
    2023-07-02
  • C语言示例讲解for循环的用法
    目录1、循环语句for的语法2、for循环中的break以及continue3、for语句的循环变量控制的一些建议4、for循环的变种5、题目1、循环语句for的语法 for (表达...
    99+
    2022-11-13
  • C语言的for循环怎么使用
    本篇内容主要讲解“C语言的for循环怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言的for循环怎么使用”吧!1、循环语句for的语法for (表达式1;表达式2;表达式3)&nbs...
    99+
    2023-07-02
  • C语言的​for循环如何使用
    这篇“C语言的for循环如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言的for循环如何使用”文章吧。for循环...
    99+
    2023-07-04
  • go语言中的协程实例分析
    这篇文章主要讲解了“go语言中的协程实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言中的协程实例分析”吧!协程的特点该任务的业务代码主动要求切换,即主动让出执行权限发生了IO,...
    99+
    2023-07-02
  • Go语言中的闭包实例分析
    这篇文章主要介绍“Go语言中的闭包实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言中的闭包实例分析”文章能帮助大家解决问题。一、函数的变量作用域和可见性全局变量在main函数执行之前初...
    99+
    2023-07-02
  • Go语言中循环Loop怎么使用
    本篇内容介绍了“Go语言中循环Loop怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Go语言和其他语言不一样,它只有一种循环方式,就...
    99+
    2023-07-02
  • Go语言的循环语句如何使用
    这篇文章主要介绍“Go语言的循环语句如何使用”,在日常操作中,相信很多人在Go语言的循环语句如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言的循环语句如何使用”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作