Go1.21 速览:新内置函数 clear、min、max 和新标准库包 cmp!

news2024/11/24 13:59:36

大家好,我是煎鱼。

前面给大家分享了 Go1.21 正式不支持 macOS 10.13 和 10.14 的支持。吓得我赶紧把我的 2017 款的老爷机从 10.14 升成 13.4。感觉 mbp 已经变成了暖宝宝。😅

今天给大家分享的是 Go 1.21 中的两个双新增项,分别是新的 3 个内置方法和新的标准库包。

新内置函数

本次新版本新增的内置函数分别是:clear、min、max,面向不同的场景,函数名和函数作用一致,不得不说论命名的艺术。

我们一个个来展开介绍。

clear 函数

引入背景

这个 clear 内置函数的加入,真的是等的够久了。在 2022 年的《Go 大佬良心发现,愿意给 map 加清除了?》的文章中,我们有介绍过。

简单来讲,有如下两个问题:

  1. Go 一直以来大家就在吵要清空 map 等类型的内容物。需要 for-range + delete 来清空,略繁琐。

  2. 有一类神奇的值,叫做:NaN(Not a Number,非数)。它是数值数据类型的一类值,表示未定义或不可表示的值。有开发者发现无法清空 NaN 的值。有 BUG。

扯到今年吵来吵去,扩大了原有的范围。

函数作用

最终 Go1.21 新加入的内置函数 clear 接受 map、slice、指向数组的指针或类型参数类型的参数。

函数签名如下:

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

分别有如下的作用:

  • 对于 map,会删除所有条目(包含前面提到的 NaN),将会变成一个空 map。len 属性的值会改变,值为 0 。

  • 对于 slice,会将 slice 或 array 长度内的所有元素设置为相应元素类型的零值。len 属性的值不会改变。

  • 对于泛型的类型参数(type parameter):类型参数的类型集必须只包含 map、slices 或指向数组的指针的类型,clear 函数将会执行实际类型参数所对应的 clear 操作。

演示代码

map 演示代码如下:

func main() {
 m := map[string]string{"脑子进": "煎鱼了", "煎鱼": "进脑子了"}
 fmt.Printf("m1: %v, len: %d\n", m, len(m))
 clear(m)
 fmt.Printf("m2: %v, len: %d\n", m, len(m))
}

输出结果:

m1: map[煎鱼:进脑子了 脑子进:煎鱼了], len: 2
m2: map[], len: 0

slice 演示代码如下:

func main() {
 s := make([]string, 3)
 s[0] = "吃"
 s[1] = "煎"
 s[2] = "鱼"

 fmt.Printf("s1: %v, len: %d, cap:%d\n", s, len(s), cap(s))
 clear(s)
 fmt.Printf("s2: %v, len: %d, cap:%d\n", s, len(s), cap(s))
}

输出结果:

s1: [吃 煎 鱼], len: 3, cap:3
s2: [  ], len: 3, cap:3

min、max 函数

这两个函数的诞生主要是 @Ian Lance Taylor 发现 min、max 函数。作用是求最小值和最大值。虽然在功能上很微小。但是在代码中却被广泛使用了,认为值得引入标准库中。

随后被 @Robert Griesemer 往内置函数引导,基于 append 和 copy 内置函数的先例,就获得许多人的点赞认可该观点,就正式加入内置函数了。

71a8a6db8998b7de333e6e1a0a639742.png

官方给出的演示代码如下:

var x, y int
m := min(x)                 // m == x
m := min(x, y)              // m 是 x 和 y 中较小的那个

m := max(x, y, 10)          // m 是 x 和 y 中较大的一个,但至少是10
c := max(1, 2.0, 10)        // c == 10.0(浮点类型)
f := max(0, float32(x))     // f 的类型是 float32

var s []string
_ = min(s...)               // 无效:不允许使用 slice 参数
t := max("", "foo", "bar")  // t == "foo" (string 类型)

对于一些特殊值和清空,例如:浮点参数、负零、NaN和无穷大。min、max 函数结果适用以下规则:

x        y    min(x, y)    max(x, y)

  -0.0    0.0         -0.0          0.0  
  -Inf      y         -Inf            y    
  +Inf      y            y         +Inf    
   NaN      y          NaN          NaN
  • 第一行:负零比(非负)零小。

  • 第二行:负无穷大比任何其他数字都小。

  • 第三行:正无穷大于任何其他数字。

  • 第四行:如果有任何一个参数是 NaN,结果就是 NaN。

新标准库包

本次在标准库中新增的包是 cmp(全称应该是 compare),主要是提供比较、对比等功能。

这块比较简单,直接上源码就懂了:

package cmp

type Ordered interface {
 ~int | ~int8 | ~int16 | ~int32 | ~int64 |
  ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
  ~float32 | ~float64 |
  ~string
}

func Less[T Ordered](x, y T) bool {
 return (isNaN(x) && !isNaN(y)) || x < y
}

func Compare[T Ordered](x, y T) int {
 xNaN := isNaN(x)
 yNaN := isNaN(y)
 if xNaN && yNaN {
  return 0
 }
 if xNaN || x < y {
  return -1
 }
 if yNaN || x > y {
  return +1
 }
 return 0
}

func isNaN[T Ordered](x T) bool {
 return x != x
}
  • Less:判断 x 是否小于 y。对于浮点类型,NaN 被认为小于任何非 NaN、 而 -0.0 不小于(等于)0.0。

  • Compare:比较 x 和 y,返回对应预定义的枚举值:

    • 如果 x 小于 y,则返回 -1

    • 如果 x 等于 y,则返回 0

    • 如果 x 大于 y,则返回 +1

  • isNaN:判断 x 是否为 NaN。

前面提到的 min、max 内置函数,本来也是要放在 cmp 包里的,不过非常荣幸的被 “提拔” 了。仅留下这几个方法。

总结

今天给大家分享了 Go1.21 的一些新内置函数 clear、min、max 和新标准库包 cmp。虽然看起来都是辅助类工具,但他们的加入也是挺费劲的,花了不少时间和讨论。

以后写业务代码和八股文时,可以适当使用这些函数。又能够简化部分代码和逻辑了。

推荐阅读

  • Go1.21 速览:过了一年半,slices、maps 泛型库终于要加入标准库。。。

  • Go1.21 速览:Go 终于打算进一步支持 WebAssembly 了。。。

  • 写在 2023 年初的后端社招面试经历(四年经验):字节 米哈游 富途 猿辅导

关注和加煎鱼微信,

一手消息和知识,拉你进技术交流群👇

ace752e20f9580241754031e8d8590fe.jpeg

a1f40044e7504d83a2eedb57fe3b61ab.png

你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QTYX量化系统实战案例分享|涨停股池中寻找反弹机会-202306

前言 “实战案例分享系列”是和大家分享一些股票量化分析工具QTYX在实战中的应用案例&#xff08;包括失败的案例&#xff09;&#xff0c;这样能够帮助大家更好地去理解QTYX中的功能设计&#xff0c;也能更好地帮助大家搭建出属于自己的量化交易系统。 关于QTYX的使用攻略可以…

Clion开发STM32之链接文件进行模块的一个解耦(编程方式)

问题的引入 在单片机的开发过程中&#xff0c;往往涉及到驱动的移植&#xff0c;但是移植的过程中又会去添加和修改主逻辑的驱动引脚初始化或时钟初始化&#xff0c;这里面就会存在一个问题就是&#xff1a;改动的地方太多了&#xff0c;容易影响到其它功能模块。所以能不能做…

200SMART CPU输入/输出接线的几个关键点

总结来看&#xff0c;S7-200系列PLC提供4个不同的基本型号的8种CPU&#xff0c;其接线方式也可大致分为6种&#xff1a; 1.CPU SR20接线 2.CPU SR40接线 3.CPU CR40接线 4.CPU ST40接线 5. CPU SR60接线 6. CPU ST60接线 除了CPU外&#xff0c;我们还需要了解200smart PLC的数…

Rocketmq面试(二)Rocketmq如何保证消息不丢失

如果想要保证消息不丢失就要知道&#xff0c;消息可能出现丢失得地方。 1.producer发送消息 2.Broker存储消息 3.Consumer消费消息 4.Broker主从切换 下面一共有9个维度可以保证消息不丢失。 目录 维度一&#xff1a;同步发送 维度二.异步发送 维度三.刷盘策略 维度四…

后端——平台登录功能实战

这里写目录标题 一、登录接口设计示意图二、后端设计三、创建用户表四、后端鉴权逻辑五、登录接口实现六、使用 JWT 生成 token七、路由鉴权八、登录与测试用例服务结合九、跨域一、登录接口设计示意图 二、后端设计 三、创建用户表 db=SQLAlchemy(app

华尔街新风向:多基金失英伟达机会

在过去一年多的美联储暴力加息周期中&#xff0c;科技成长股一直不怎么受到主流投资者待见&#xff0c;但面对今年美股“人工智能涨个不停”的局面后&#xff0c;过去两周里大量的知名基金都在撒开脚丫子狂追高速狂飙的“英伟达列车”。 根据监管文件显示&#xff0c;包括道富…

视频与AI,与进程交互(一)

目的 正在写一个视频与AI的工具&#xff0c;从接入&#xff0c;算法处理&#xff0c;转发&#xff0c;存储&#xff0c; 到调用AI进程&#xff0c;并且与AI进程进行交互&#xff0c;插件化&#xff0c;脚本化&#xff0c;做得比较辛苦&#xff0c;期间的进程和线程交互以及结果…

基于奥比中光深度相机进行虹膜识别处理

MATLAB仿真实现效果展示 图1 奥比中光红外深度相机拍摄效果 MATLAB仿真红外效果的图片&#xff0c;使用奥比中光的Astra_Pro深度相机和Astra进行拍摄&#xff0c;效果很好。 声明&#xff1a;本文的虹膜识别系统模型参考了西澳大利亚大学&#xff0c;计算机科学与软件工程学…

Spark 优化

1.RDD分区数 Task是作用在每个分区上的&#xff0c;每个分区至少需要一个Task去处理 改变分区数可间接改变任务的并行度&#xff0c;类似手动指定Reduce数量 第一个RDD的分区数由切片的数量决定 默认情况下子RDD的分区数等于父RDD的分区数 Shuflle类算子可手动指定RDD分区数 设…

chatgpt赋能python:Python屏幕截图并保存:简单易用的库

Python屏幕截图并保存&#xff1a;简单易用的库 屏幕截图是程序员们在软件开发中常用到的一个小技巧&#xff0c;对于调试、记录Bug、编写文档等方面有极大的帮助。而其中&#xff0c;Python成为了众多程序员的利器之一。 在Python中&#xff0c;大量的库提供了屏幕截图的方法…

PX4-机架选取(基于QG地面站)

因为我的无人机是F450&#xff0c;所以我选用F450的机架 点击应用后&#xff0c;要稍等一会 应用完成后在概述会标识

经纬度坐标为中心点生成米距离长度半径的圆形面,含java js源码+在线绘制,代码简单零依赖

文章目录 java版源码js版源码在线绘制预览效果关于计算的精确度 前些时间在更新我的坐标边界查询工具的时候&#xff0c;需要用到经纬度坐标点的距离计算&#xff0c;和以坐标点为中心生成一个指定距离为半径的圆&#xff0c;搜了一下没有找到现成简单又合适的代码&#xff0c;…

基于OpenCV 和 Dlib 进行头部姿态估计

写在前面 工作中遇到&#xff0c;简单整理博文内容涉及基于 OpenCV 和 Dlib头部姿态评估的简单Demo理解不足小伙伴帮忙指正 庐山烟雨浙江潮&#xff0c;未到千般恨不消。到得还来别无事&#xff0c;庐山烟雨浙江潮。 ----《庐山烟雨浙江潮》苏轼 https://github.com/LIRUILONGS…

2023智源大会议程公开 | 大模型新基建与智力运营论坛

6月9日&#xff0c;2023北京智源大会&#xff0c;将邀请这一领域的探索者、实践者、以及关心智能科学的每个人&#xff0c;共同拉开未来舞台的帷幕&#xff0c;你准备好了吗&#xff1f;与会知名嘉宾包括&#xff0c;图灵奖得主Yann LeCun、OpenAI创始人Sam Altman、图灵奖得主…

【模型评估】混淆矩阵(confusion_matrix)之 TP、FP、TN、FN;敏感度、特异度、准确率、精确率

你这蠢货&#xff0c;是不是又把酸葡萄和葡萄酸弄“混淆”啦&#xff01;&#xff01;&#xff01;这里的混淆&#xff0c;我们细品&#xff0c;帮助我们理解名词“混淆矩阵” 上面日常情况中的混淆就是&#xff1a;是否把某两件东西或者多件东西给弄混了&#xff0c;迷糊了。把…

数据隐私保护的最佳实践:全面了解数据脱敏方案

1、数据脱敏 数据脱敏是一种保护敏感信息的安全措施&#xff0c;通常会将真实数据替换成模拟数据或者经过处理后的数据。下面是常见的数据脱敏实现方案&#xff1a; 字符串替换&#xff1a;将需要脱敏的字符串中指定位置的字符替换为“****”或其他符号。例如&#xff0c;将银…

MySQL数据库误删恢复

前言 经常听说删库跑路这真的不只是一句玩笑话,若不小心删除了数据库,事情很严重。你一个不小心可能会给公司删没。建议研发不要直连生成环境,一般的话都会分配账号权限,生产环境的账号尽量是只读,以防你一个不经意给库或表删除。一定要备份,这很重要,这是一个血的教训。…

iTOP3568开发板-Buildroot 系统设置待机和锁屏

Weston 的超时待机时长可以在启动参数中配置,也可以在 weston.ini 的 core 段配置。 方法一&#xff1a; 修改文件系统中/etc/init.d/S50launcher 文件&#xff0c;如下图所示的红框&#xff0c;0 代表禁止待机&#xff0c;可自行设置待机时间&#xff0c;单位是秒。 方法二&a…

深浅拷贝各种实现方式性能

拷贝方式 拷贝方式类型原理备注Object.clone()默认 浅拷贝&#xff0c;可以自定义实现深拷贝对象内存复制constructor可以实现深拷贝自定义实现BeanUtil.copyProperties()浅拷贝利用 getter/setter 实现属性拷贝反射&#xff0c;spring utilCollectionUtils.clone()深拷贝本质…

强化学习驱动的低延迟视频传输

随着视频会议、视频直播的流行以及未来AR/VR业务的发展&#xff0c;低延迟视频传输服务被广泛使用&#xff0c;但视频质量&#xff08;QoE&#xff09;还不能满足用户要求。那么近年来新兴的AI神经网络是否能为视频传输带来智能化的优化&#xff1f;今天LiveVideoStack大会北京…