当前位置: 首页 > news >正文

Go 1.22 中的 for 循环新特性详解

目录

每次迭代都创建新变量

支持整数类型循环

小结


在 Go 语言中,for 循环是实现迭代的主要方式。Go 中的 for 循环非常灵活,有多种使用方式,包括传统的三部分 for 循环、类似于其他语言中的 while 循环以及迭代集合的 range 循环。

在 1.22 之前的版本中,for 循环的变量只创建一次,在每个迭代中为这个变量赋予对应的值。由于这个特性,使用起来很容易犯错,一不小心就会导致意想不到的行为。看如下示例:

package mainimport ("fmt""time"
)func main() {s := []string{"a", "b"}for _, v := range s {go func() {fmt.Print(v)}()}time.Sleep(time.Second * 1)
}

这个示例结果一般都会输出 bb,而并非预期中的 ab 或 ba。for 循环遍历 s 切片,每次迭代中都启动一个新的 goroutine 来打印变量 v 的值。由于 goroutine 是并发执行的,并且 for 循环不会等待它们完成。由于 for 循环的迭代速度非常快,当 goroutine 启动时,都共享了循环变量 v 的同一个实例,而不是在每次迭代时捕获 v 的值。当这些 goroutine 最终执行时,循环变量 v 的值大多数情况下已经变成了循环的最后一个值 b。但是由于并发的性质,实际的输出可能会有所不同。

当然可以通过其他写法来避免这个问题,每次可以额外使用一个新的变量来承接,示例代码如下:

package mainimport ("fmt""time"
)func main() {s := []string{"a", "b"}for _, v := range s {newV := vgo func() {fmt.Print(newV)}()}time.Sleep(time.Second * 1)
}

也可以使用通过给闭包函数传参的方式,示例代码如下:

package mainimport ("fmt""time"
)func main() {s := []string{"a", "b"}for _, v := range s {go func(v string) {fmt.Print(v)}(v)}time.Sleep(time.Second * 1)
}

这两种方式都略显繁琐。有了这个知识背景,接下来看下 Go 1.22 中 for 循环的第一个变化。

每次迭代都创建新变量

在 Go 1.22 中,for 循环的每次迭代都会创建新变量,这将会避免上文示例中的问题。还是按照第一个代码示例执行一次,代码如下:

package mainimport ("fmt""time"
)func main() {s := []string{"a", "b"}for _, v := range s {go func() {fmt.Print(v)}()}time.Sleep(time.Second * 1)
}

可以发现这段代码不再输出 bb 而是输出了预期中的 ab 或者 ba。因为每次迭代都会创建新变量 v,所以每个闭包都持有对不同 v 变量的引用,因此,输出了预期的结果。循环的每次迭代都会创建新变量的这一更新,提高了代码的安全性和可预测性。接下来看下 Go 1.22 中 for 循环的第二个变化。

支持整数类型循环

在 Go 1.22 之前,for range 循环支持 array、slice、string、map 和 channel 类型的表达式。从 1.22 开始,新增了对整数类型表达式的支持。这意味着可以直接使用整数进行循环,例如如下代码示例,将迭代从 0 到 2 的整数。

package mainimport "fmt"func main() {for i := range 3 {fmt.Println(i)}
}

这种写法在 1.22 之前的版本会报错。

小结

这两项更新显著提高了 Go 语言在编写循环时的灵活性和安全性,有助于避免一些常见的编程错误和陷阱。

相关文章:

Go 1.22 中的 for 循环新特性详解

目录 每次迭代都创建新变量 支持整数类型循环 小结 在 Go 语言中,for 循环是实现迭代的主要方式。Go 中的 for 循环非常灵活,有多种使用方式,包括传统的三部分 for 循环、类似于其他语言中的 while 循环以及迭代集合的 range 循环。 在 1…...

igolang学习2,golang开发配置国内镜像

go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct...

R语言空间分析、模拟预测与可视化

随着地理信息系统(GIS)和大尺度研究的发展,空间数据的管理、统计与制图变得越来越重要。R语言在数据分析、挖掘和可视化中发挥着重要的作用,其中在空间分析方面扮演着重要角色,与空间相关的包的数量也达到130多个。在本…...

体育赛事直播系统软件开发

体育赛事直播系统的软件开发是一个复杂的项目,需要多个方面的准备和工作。以下是开发这样一个系统可能涉及的主要步骤和考虑因素: 需求分析和规划:首先需要明确系统的功能需求,包括直播视频的流媒体处理、用户管理、直播赛事安排…...

使用 kind 集群安装运行极狐GitLab Runner【上】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 关于 kind kind 是一个用来运行本地 Kubernetes 机群的工具&a…...

wine 源码 vk3d wine-gecko wine-mono 各版本 国内下载地址 中国科技技术大学源

下载地址 Index of /wine/...

【ArcGIS微课1000例】0104:二位面状数据转三维多面体(建筑物按高度拉伸)

文章目录 一、加载数据二、添加高度字段三、三维拉伸显示四、生成三维体数据五、注意事项一、加载数据 打开ArcScene,加载配套实验数据(0104.rar中的二维建筑物矢量数据,订阅专栏,获取专栏所有文章阅读权限及配套数据),如下图所示: 二、添加高度字段 本实验将二维数据…...

jquery简介与解析

jQuery是一款流行的JavaScript库,旨在简化客户端脚本编写。它针对DOM操作、事件处理、动画效果和AJAX交互提供了简洁高效的解决方案,使得开发者能够更加便捷地创建交互式网页。 // jQuery小插件:给带有highlight类的元素添加鼠标悬停效果 (fu…...

Apache Commons开源的工具库介绍

Apache Commons 是 Apache 软件基金会主持的一个项目,旨在提供一系列可重用的 Java 组件。这些组件覆盖了从数据封装、文本处理到网络通信等各个方面,是 Java 开发中常用的一系列工具库。Apache Commons 项目下的各个库通常以 "commons-" 开头…...

SQL语法法则

概念 SQL语法规则:SQL是一种结构化编程语言 基础SQL指令通常是以行为单位 SQL指令需要语句结束待,默认是英文分号:;、\g、\G SQL指令类似自然语言 编写的SQL中如果用到了关键字或者保留字,需要使用反引号、来包裹,让系统忽略 …...

Java命令模式:让请求成为对象

Java命令模式:让请求成为对象 在软件设计中,我们经常遇到需要将操作或请求封装成对象的情况。这样,我们可以将它们作为参数传递、排队、记录或撤销。命令模式正是为了满足这种需求而诞生的。在命令模式中,一个请求或操作被封装成…...

研究生摆烂摆烂的一个寒假

寒假:27-24,不到一个月 刚回家,不想学习,摆烂 想学了,又过年了,于是又开摆 又想学了,家里面有有点小事,于是又开摆 摆完,没想到就返校啦 期末作业没完成&#xff08…...

singularity-ce-4.1.0 + go 完整安装步骤,及报错解决

singularity-ce-4.1.0 + go 1.20 完整安装步骤. 解决bug: checking: host Go compiler (at least version 1.13)... not found! mconfig: could not complete configuration服务器基础环境: 阿里云服务器: => lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-n…...

笔记-电感充放电过程状态记录

描述:电感充放电过程状态记录 为加深对电感充放电的理解,特做一次记录。 目录 一、准备工作二、电感状态记录1、电感刚开始充电瞬间2、电感充电期间3、电感充电完毕4、电感开始放电瞬间5、电感放电完毕6、电感充放电完整记录 一、准备工作 1、在线平台…...

石头剪刀布游戏(C语言)

题目描述 石头剪刀布游戏有 3 种出拳形状:石头、剪刀、布。分别用字母 A , B , C 表示。 游戏规则: 出拳形状之间的胜负规则如下: A > B;B > C;C > A;">"左边一个字母,表示相对优…...

《卓有成效的管理者》

前言 管理工作在很大程度上是要言传身教的,如果管理者不懂得如何在自己的工作中做到卓有成效,就会给其他人树立错误的榜样。 第 1 章 卓有成效是可以学习的 关于体力工作,我们已有一套完整的衡量方法和制度,从工程设计到质量控制…...

基于RK3399 Android11适配OV13850 MIPI摄像头

目录 1、原理图分析2、编写和配置设备树3、调试方法4、遇到的问题与解决5、补丁 1、原理图分析 从上图可看出,我们需要关心的,①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤…...

学生个性化成长平台搭建随笔记

1.Vue的自定义指令 在 Vue.js 中,我们可以通过 Vue.directive() 方法来定义自定义指令。具体来说,我们需要传递两个参数: 指令名称:表示我们要定义的指令名称,可以是一个字符串值,例如:has-rol…...

XTuner InternLM-Chat 个人小助手认知微调实践

要解决的问题: 如何让模型知道自己做什么,是什么样身份。是谁创建了他!!! 概述 目标:通过微调,帮助模型认清了解对自己身份弟位 方式:使用XTuner进行微调 微调前(回答…...

编程笔记 Golang基础 025 列表

编程笔记 Golang基础 025 列表 一、列表的功能二、示例程序三、注意事项 在 Go 语言中,列表是一种数据结构,用于存储有序的元素集合,允许高效地进行插入和删除操作。Go 标准库中的 container/list 包提供了一个内置的双链表实现,它…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...