当前位置: 首页 > 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;但关闭当前…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...