Go 1.21新增的 slices 包详解(二)
Go 1.21新增的 slices 包提供了很多和切片相关的函数,可以用于任何类型的切片。
slices.Delete
定义如下:
func Delete[S ~[]E, E any](s S, i, j int) S
从 s 中删除元素 s[i:j],返回修改后的切片。如果 s[i:j] 不是 s 的有效切片,则会 panic。Delete是 O(len(s)-j),因此如果必须删除许多项,最好调用一次删除全部,而不是逐个删除。Delete不能修改元素 s[len(s)-(j-i):len(s)]。如果这些元素包含指针,可以考虑将这些元素归零,以便它们引用的对象可以被垃圾回收。简单示例如下:
package mainimport ("fmt""slices"
)func main() {letters := []string{"a", "b", "c", "d", "e"}letters = slices.Delete(letters, 1, 4)fmt.Println(letters) // [a e]}
slices.DeleteFunc
定义如下:
func DeleteFunc[S ~[]E, E any](s S, del func(E) bool) S
从 s 中删除 del函数返回 true 的元素,并返回修改后的切片。当 DeleteFunc 删除m个元素时,它可能不会修改元素s[len(s)-m:len(s)]。如果这些元素包含指针,、可以考虑将这些元素归零,以便它们引用的对象可以被垃圾回收。简单示例如下:
package mainimport ("fmt""slices"
)func main() {seq := []int{0, 1, 1, 2, 3, 5, 8}seq = slices.DeleteFunc(seq, func(n int) bool {return n%2 != 0 // 删除奇数})fmt.Println(seq) // [0 2 8]
}
slices.Equal
定义如下:
func Equal[S ~[]E, E comparable](s1, s2 S) bool
判断两个切片是否相等(长度相同且所有元素相等)。如果长度不同,返回 false。如果长度相同,将按索引递增的顺序比较元素,并在第一个不相等出现时停止比较。简单示例如下:
package mainimport ("fmt""slices"
)func main() {numbers := []int{0, 42, 8}fmt.Println(slices.Equal(numbers, []int{0, 42, 8})) // truefmt.Println(slices.Equal(numbers, []int{10})) // false
}
slices.EqualFunc
定义如下:
func EqualFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, eq func(E1, E2) bool) bool
对每对元素使用自定义函数来判断两个片是否相等。如果长度不同,返回false。如果长度相同,将按索引递增的顺序比较元素,并在 eq 返回 false 的第一个索引处停止比较。简单示例如下:
package mainimport ("fmt""slices""strconv"
)func main() {numbers := []int{0, 42, 8}strings := []string{"000", "42", "0o10"}equal := slices.EqualFunc(numbers, strings, func(n int, s string) bool {sn, err := strconv.ParseInt(s, 0, 64)if err != nil {return false}return n == int(sn)})fmt.Println(equal) // true
}
slices.Grow
定义如下:
func Grow[S ~[]E, E any](s S, n int) S
增加片的容量,以为另外 n 个元素提供空间。在Grow(n)之后,至少可以将n个元素添加到片中,而无需再进行分配。如果 n 为负值或太大而无法分配内存,就会 panic。
slices.Index
定义如下:
func Index[S ~[]E, E comparable](s S, v E) int
返回 v 在 s 中第一次出现的索引,如果不存在则返回-1。简单示例如下:
package mainimport ("fmt""slices"
)func main() {numbers := []int{0, 42, 8}fmt.Println(slices.Index(numbers, 8)) // 2fmt.Println(slices.Index(numbers, 7)) // -1
}
slices.IndexFunc
定义如下:
func IndexFunc[S ~[]E, E any](s S, f func(E) bool) int
返回第一个满足 f(s[i]) 的索引 i,如果不满足则返回-1。简单示例如下:
package mainimport ("fmt""slices"
)func main() {numbers := []int{0, 42, -10, 8}i := slices.IndexFunc(numbers, func(n int) bool {return n < 0})fmt.Println("First negative at index", i) // 2
}
slices.Insert
定义如下:
func Insert[S ~[]E, E any](s S, i int, v ...E) S
将 值 v… 在索引 i 处插入到 s,返回修改后的切片。s[i:] 中的元素被上移以腾出空间。在返回的切片 r 中,r[i] == v[0], r[i+len(v)] == 原来在 r[i] 处的 value。如果超出范围,则 panic。这个函数的复杂度为 O(len(s) + len(v))。简单示例如下:
package mainimport ("fmt""slices"
)func main() {names := []string{"Alice", "Bob", "Vera"}names = slices.Insert(names, 1, "Bill", "Billie")names = slices.Insert(names, len(names), "Zac")fmt.Println(names) // [Alice Bill Billie Bob Vera Zac]
}
slices.IsSorted
定义如下:
func IsSorted[S ~[]E, E cmp.Ordered](x S) bool
判断 x 是否按升序排序。简单示例如下:
package mainimport ("fmt""slices"
)func main() {fmt.Println(slices.IsSorted([]string{"Alice", "Bob", "Vera"})) // truefmt.Println(slices.IsSorted([]int{0, 2, 1})) // false
}
【参考资料】
Package slices(https://golang.google.cn/pkg/slices/)
相关文章:
Go 1.21新增的 slices 包详解(二)
Go 1.21新增的 slices 包提供了很多和切片相关的函数,可以用于任何类型的切片。 slices.Delete 定义如下: func Delete[S ~[]E, E any](s S, i, j int) S 从 s 中删除元素 s[i:j],返回修改后的切片。如果 s[i:j] 不是 s 的有效切片&#…...

解决charles无法抓取localhost数据包
我们有时候在本地调试的时候,使用charles抓取向本地服务发送的请求的,发现无法抓取。 charles官方也作了相应说明: 大概意思就是 某些系统使用的是硬编码不能使用localhost进行传输,所以当我们连接到 localhost的时候,…...
基于注解优雅的实现接口幂等性
一、什么是幂等性 简单来说,就是对一个接口执行重复的多次请求,与一次请求所产生的结果是相同的,听起来非常容易理解,但要真正的在系统中要始终保持这个目标,是需要很严谨的设计的,在实际的生产环境下&…...

flutter:webview_flutter和flutter_inappwebview的简单使用
前言 最近在研究如何在应用程序中嵌入Web视图,发现有两个库不错。 一个是官方维护、一个是第三方维护。因为没说特别的需求,就使用了官方库,实现一些简单功能是完全ok的 webview_flutter 不建议使用,因为效果不怎么样…...

opencv进阶09-视频处理cv2.VideoCapture示例(打开本机电脑摄像头)
视频信号(以下简称为视频)是非常重要的视觉信息来源,它是视觉处理过程中经常要处理的一类信号。实际上,视频是由一系列图像构成的,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的。获取…...

大语言模型与语义搜索;钉钉个人版启动内测,提供多项AI服务
🦉 AI新闻 🚀 钉钉个人版启动内测,提供多项AI服务 摘要:钉钉个人版正式开始内测,面向小团队、个人用户、高校大学生等人群。该版本具有AI为核心的功能,包括文生文AI、文生图AI和角色化对话等。用户可通过…...

小程序-基于vant的Picker组件实现省市区选择
一、原因 因vant/area-data部分的市/区数据跟后台使用的高德/腾讯省市区有所出入,故须保持跟后台用同一份数据,所以考虑以下几个组件 1、Area 2、Cascader 3、Picker 因为使用的是高德地图的省市区json文件,用area的话修改结构代价太大&…...

智慧水利利用4G物联网技术实现远程监测、控制、管理
智慧水利工业路由器是集合数据采集、实时监控、远程管理的4G物联网通讯设备,能够让传统水利系统实现智能化的实时监控和远程管理。工业路由器利用4G无线网络技术,能够实时传输数据和终端信息,为水利系统的运维提供有效的支持。 智慧水利系统是…...
sql server Varchar转换为Datetime
将Varchar转换为Datetime是一个常见的需求,在处理日期和时间数据时特别有用。在SQL Server中,可以使用CONVERT函数或CAST函数将Varchar转换为Datetime。 使用CONVERT函数 CONVERT函数可以将一个值从一个类型转换为另一个类型。以下是使用CONVERT函数将…...

什么文件传输协议才能保障跨国文件传输安全又稳定
在当今的全球化时代,跨国文件传输是一种常见而又重要的需求,无论是个人还是企业,都需要通过网络来分享和交换各种类型和大小的文件。但是,跨国文件传输也面临着许多挑战和风险,如何选择一个合适的文件传输协议…...
LeetCode笔记:Weekly Contest 359
LeetCode笔记:Weekly Contest 359 1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-359 1. 题目一 …...
使用Java和ChatGPT Api来创建自己的大模型聊天机器人
文章目录 前言ChatGPT Api简析Chatfunction call Embeddings 制作机器人上下文向量数据库 更多场景介绍扩展阅读 前言 什么是大模型? 大型语言模型(LLM)是一种深度学习模型,它使用大量数据进行预训练,并能够通过提示工…...

Maven介绍_下载_安装_使用_原理
文章目录 1 Maven介绍1.1 Maven是介绍1.2 Maven的作用 2 Maven下载与安装2.1 官网下载2.2 文件目录2.3 环境配置 3 Maven基础概念3.1 仓库分类3.2 依赖坐标3.3 坐标组成 4 Maven配置4.1 本地仓库配置4.2 远程仓库的设置4.3 镜像仓库配置4.4 IDEA配置Maven 5 Maven项目创建5.1 M…...
算法通关村十一关 | 位运算的规则
1.数字在计算机中的表示 机器数:一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是自带符号的,在计算机用一个数的最高位存放符号,整数为0,负数为1。比如,十进制中的数3,计算机字…...

【Rust】Rust学习 第十五章智能指针
指针 (pointer)是一个包含内存地址的变量的通用概念。这个地址引用,或 “指向”(points at)一些其他数据。Rust 中最常见的指针是第四章介绍的 引用(reference)。引用以 & 符号为标志并借用…...
炒股怎样加杠杆?关于股票杠杠平台比例的选择知识分析
在股票市场中,加杠杆是一种常见的投资策略,可以帮助投资者提升收益,但也伴随着更高的风险。本文将介绍炒股加杠杆的具体步骤和股票杠杆平台比例选择的知识分析,帮助读者更好地了解并使用这一策略。 一、炒股加杠杆的步骤 1. 选择…...

【jenkins】jenkins流水线构建打包jar,生成docker镜像,重启docker服务的过程,在jenkins上一键完成,实现提交代码自动构建的功能
【jenkins】jenkins流水线构建打包jar,生成docker镜像,重启docker服务的过程,在jenkins上一键完成,实现提交代码自动构建,服务重启,服务发布的功能。一键实现。非常的舒服。 1. 启动脚本 shell脚本 这是 s…...

Pytest使用fixture实现token共享
同学们在做pytest接口自动化时,会遇到一个场景就是不同的测试用例需要有一个登录的前置步骤,登录完成后会获取到token,用于之后的代码中。首先我先演示一个常规的做法。 首先在conftest定义一个login的方法,方法返回token pytes…...
You have docker-compose v1 installed, but we require Docker Compose v2.
curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose docker-compose --version...
nlopt在windows上的安装使用
nlopt在windows上的安装使用 目录 nlopt在windows上的安装使用一、nlopt下载二、def转lib三、代码 一、nlopt下载 1.下载nlopt库:https://nlopt.readthedocs.io/en/latest/ 2.解压 3.下载dll和def:http://ab-initio.mit.edu/wiki/index.php?titleNLopt…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...