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

Golang1.21更新内容全面介绍~

我的掘金平台原文地址Golang1.21更新内容全面介绍~

前言

在Golang1.21这一次更新中,主要更新内容为:

  • for range的一个语义变更 、

  • 新加入max、min、clear方法、

  • contenxt增添api、

  • WASI的支持

本文主要带大家熟悉这些变更的内容~


1.for语义的变更

首先在go中for range其实有一个比较坑的地方

举一个简单的例子


printRes:=[]func(){}
for _,v:=range []int{1,2,3,4,5}{printRes=append(printRes,func(){fmt.Print(v)})
}
for _,v:=range printRes{v()
}

不知道for这个坑的同学可能会认为结果应该为12345,但实际上它的结果是55555

其原因就是这里的循环遍历是使循环变量每次循环
循环遍历始终是同一个v这才导致了最后的结果都是一致的,要想达到使循环变量每次迭代而不是每次循环其实也不难,只需要在每次循环时都新变量去重新赋值就好了v:=v

而1.21也是决定了重新定义循环的语义,让其是每次迭代。在1.21当中我们只需要在运行时额外加一个 GOEXPERIMENT=loopvar构建程序即可

2.新增max,min,clear函数

在1.21版本go也是基于泛型新增了maxmin函数,支持多种类型,多参数,在以前都需要自己去写这两个方法~

带大家看一下源码

// The max built-in function returns the largest value of a fixed number of
// arguments of [cmp.Ordered] types. There must be at least one argument.
// If T is a floating-point type and any of the arguments are NaNs,
// max will return NaN.
func max[T cmp.Ordered](x T, y ...T) T// The min built-in function returns the smallest value of a fixed number of
// arguments of [cmp.Ordered] types. There must be at least one argument.
// If T is a floating-point type and any of the arguments are NaNs,
// min will return NaN.
func min[T cmp.Ordered](x T, y ...T) T

//支持的参数类型
type Ordered interface {~int | ~int8 | ~int16 | ~int32 | ~int64 |~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |~float32 | ~float64 |~string
}

举例

fmt.Println(max(1,uint(7),8))  //-->8

除去max(),min()。还有一个clear()的方法,顾名思义就是对传入的变量进行一个数据回收

func clear[T ~[]Type | ~map[Type]Type1](t T)

可以看到该方法主要服务于slice与map类型
对于切片,clear会将其数据变为默认值0,但是len,cap都不变

s:=[]int{1,2,3,4,5,6,7,8,9,10}
clear(s)
fmt.Printf("s:%v,len:%v,cap:%v",s,len(s),cap(s))//s:[0 0 0 0 0 0 0 0 0 0],len:10,cap:10

而对于map,结果是这样的

m:=make(map[string]int,10)
m["a"]=1
fmt.Printf("m:%v,len:%v\n",m,len(m))
clear(m)
fmt.Printf("m:%v,len:%v",m,len(m))//m:map[a:1],len:1
//m:map[],len:0

数据清空,桶也清空~


3.contenxt更新

context应该不必我多介绍了,Go语言特别常用的用于不同go协程之间的通信,收发取消信号、截至信号、元数据等上下文。

context这次更新主要是针对cancel()发送取消信号增加了一个取消原因以及回调函数的增添

func WithCancelCause(parent Context) (ctx Context, cancel CancelCauseFunc)func WithTimeoutCause(parent Context, timeout time.Duration, cause error) (Context, CancelFunc)func WithDeadlineCause(parent Context, d time.Time, cause error) (Context, CancelFunc)

如图在三个api中形参都增添了一个cause的错误类型,当cancel()调用或者超时后那么context.Cause(ctx)
方法就会获得我们自定义的错误,而非默认的ctx.Err()中的context deadline exceeded。这样做的好处显而易见,当我们程序出错的,根据我们自定义的错误去追踪错误显然会比默认的context deadline exceeded更精确

代码举例:

myctxErr:=fmt.Errorf("自定义ctxErr错误")ctx,cancel:=context.WithTimeoutCause(context.Background(),1*time.Second,myctxErr)
defer cancel()
time.Sleep(2*time.Second)
fmt.Println(context.Cause(ctx))//自定义ctxErr错误

而关于回调函数,

func AfterFunc(ctx Context, f func()) (stop func() bool)

其作用是在cancel取消或者超时后Evict

在一些场景下我们常常要用goroutine+select+channel这套组合拳来实现监听取消的行为并为此做出后续的业务

而有了这个回调函数可以让我们用更简洁的代码来实现这一功能

举例:

func main(){myctxErr:=fmt.Errorf("自定义ctxErr错误")ctx,cancel:=context.WithTimeoutCause(context.Background(),5*time.Second,myctxErr)context.AfterFunc(ctx,func1)defer cancel()time.Sleep(6*time.Second)fmt.Println(context.Cause(ctx))
}//evictEvent
func func1()  {fmt.Println(666)
}//666
//自定义ctxErr错误

4.WASI支持

Go1.21 起,Go 将会支持 WASI 。预计先支持 WASI Preview1 标准,后续 WASI Preview2 成熟后会继续支持新标准。

而WASI全称为WebAssembly System Interface
不熟悉想了解的朋友可以观看WASI 前瞻 - 知乎 (zhihu.com)这篇文章

以上就是我分享所有内容,希望能够帮助到大家~~

相关文章:

Golang1.21更新内容全面介绍~

我的掘金平台原文地址Golang1.21更新内容全面介绍~ 前言 在Golang1.21这一次更新中,主要更新内容为: for range的一个语义变更 、 新加入max、min、clear方法、 contenxt增添api、 WASI的支持 本文主要带大家熟悉这些变更的内容~ 1.for语义的变更…...

ArcGIS 10.4安装教程!

软件介绍:ArcGIS是一款专业的电子地图信息编辑和开发软件,提供一种快速并且使用简单的方式浏览地理信息,无论是2D还是3D的信息。软件内置多种编辑工具,可以轻松的完成地图生产全过程,为地图分析和处理提供了新的解决方…...

华为云云服务器云耀L实例评测 | 从零开始:华为云云服务器L实例使用教程

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

ElasticSearch配置

2) 搭建ElasticSearch环境 2.1) 拉取镜像 docker pull elasticsearch:7.4.02.2) 创建容器 docker run -id --name elasticsearch -d --restartalways -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.…...

MySQL优化第二篇

MySQL优化第二篇 性能分析小表驱动大表慢查询日志日志分析工具mysqldumpslow Show Profile进行SQL分析(重中之重) 七种JOIN 1、inner join :可以简写为join,表示的是交集,也就是两张表的共同数据 sql语句&#xff1a…...

基于python解决鸡兔同笼问题

一、什么是鸡兔同笼问题? 鸡兔同笼问题是一个经典的数学问题。问题描述:鸡和兔子共有头数a和脚数b,求鸡和兔子的数量。 解析:设鸡的数量为x,兔子的数量为y,那么可以得到以下两个方程: 1. x y…...

2023 Google 开发者大会|Mobile开发专题追踪

文章目录 前言大会介绍涉及内容MobileWebAICloud Mobile开发专题多终端应用的开发适配大屏视频流可穿戴设备电视新的设计中心 构建高质量的应用高级相机和媒体功能用户的安全和隐私更精细的视觉体验 小结 前言 哈喽大家好,我是阿Q。近期,【2023 Google …...

最新版WPS 2023 加载Zotero方法

安装wps2019vba.exe,获取链接:链接:https://pan.baidu.com/s/1eeoc6Tmwyzxh3n1MFQTVeA 提取码:6431 –来自百度网盘超级会员V8的分享 打开WPS的工具的加载项 添加文件路径,我的在: C:\Users\Administrat…...

详解爬虫策略,反爬虫策略,反反爬爬虫策略

爬虫策略 爬取策略是网络爬虫在执行网页抓取任务时所遵循的规则或策略。这些策略决定了爬虫如何从一个页面转到另一个页面,什么时间进行抓取,以及应该抓取哪些内容。以下是几种常见的爬取策略: 深度优先搜索(DFS) 在…...

ES6中的Promise对象

1. Promise是什么 Promise简单来说就是一个容器,里面保存着未来才会结束的事件的结果(这个事件就是异步操作)。Promise是一个对象(构造函数),可以获取异步操作的结果。 特点: 对象的状态不受外…...

vue 知识点———— 生命周期

1.什么是生命周期 Vue实例从创建到销毁的过程,叫生命周期。 从开始创建、初始化数据、编译模版、挂载Dom-渲染、更新-渲染、销毁等过程。 2.生命周期一共有几个阶段 创建前/后, 载入前/后,更新前/后,销毁前/销毁后 3.初始化相关属性 beforeCreate(创建前…...

焊接符号学习

欧美焊接符号举例 4.5------表示焊点直径 【3】------根据图示说明,表示此项为CC项或者SC项 6-------表示此处为第六CC项或者SC项 BETWEEN①AND②------表示①件和②件俩点之间的焊点 12X------表示俩点之间的焊点个数为12个 日本焊接符号举例 A------根据图示&…...

记录linux清理空间的步骤

sudo du -sh /* 看整体空间占用情况 [roothost ~]# sudo du -sh /* 0 /bin 143M /boot 85M /data 0 /dev 38M /etc 4.0K /home 0 /lib 0 /lib64 16K /lostfound 4.0K /media 4.0K /mnt 31M /opt 0 /proc 260K /r…...

丰田工厂停产竟然因为磁盘...

丰田因磁盘空间不足关闭14家工厂 在如今的信息时代,无论是生活还是工作,我们都离不开计算机和网络。然而,令人惊讶的是,一家全球知名的汽车制造商——丰田,却因为磁盘空间不足的问题,被迫关闭了14家工厂。…...

Python工程师Java之路(p)Maven聚合和继承

文章目录 依赖管理依赖传递可选依赖和排除依赖 继承与聚合 依赖管理 指当前项目运行所需的jar&#xff0c;一个项目可以设置多个依赖 <!-- 设置当前项目所依赖的所有jar --> <dependencies><!-- 设置具体的依赖 --><dependency><!-- 依赖所属群组…...

Java 复习笔记 - Lambda 表达式 he 经典算法题

文章目录 Lambda表达式 概述&#xff08;一&#xff09;基本作用&#xff08;二&#xff09;特点 一&#xff0c;初识Java中的Lambda 表达式二&#xff0c;函数式编程三&#xff0c;省略写法四&#xff0c;练习&#xff1a;使用Lambda 表达式 简化Comparator接口的匿名形式综合…...

算法——快乐数

202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 由图可知&#xff0c;其实这也是一个判断循环的过程&#xff0c;要用到快慢指针&#xff0c;且相遇后&#xff0c;若在全为1的循环里&#xff0c;那么就是快乐数&#xff0c;若相遇后不为1&#xff0c;说明这不是快乐数。 …...

vue使用window.location.href 跳转失败

问题&#xff1a; vue项目中直接使用window.lcocation.href跳转外链&#xff0c;但是跳转的链接会被拼接成这样 http://localhost:8080/#/www.baidu.com 原因&#xff1a; 我们打开的外部链接会自动拼接我们的源地址&#xff0c;导致网址链接不正确&#xff0c;无法正常访问 …...

【备忘】清理Office缓存

【背景】电脑安装了M365 Apps for enterprise的客户端&#xff0c;遇到不常见的奇怪问题。尝试看清理缓存是否可以解决。 【清理步骤】 1. 关闭所有Office365 应用&#xff1b; 2. 搜索 %AppData% &#xff0c;并打开该文件夹&#xff1b; 3. 进到 AppData > Local > M…...

MacOS环境变量source生效但重启后又失效

https://blog.csdn.net/dxk539687357/article/details/127942044 .bash_profile 和 .zshrc 都是macos系统重环境变量配置的文件&#xff0c;但是两者有不同之处。 .bash_profile&#xff1a;在执行source ~/.bash_profile&#xff0c;只在当前窗口生效&#xff0c;但关闭当前…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...