Go 1.21.0 新增标准库 slices 和 maps 详解

简介: Go 1.21.0 新增标准库 slices 和 maps 详解

介绍

在 Go 语言项目开发中,我们经常会使用 slicemap 数据类型,因为 Go 1.18.0 开始支持泛型,所以 slice 的元素可能是任意类型,mapkeyvalue 也可能是任意类型。

Go 1.21.0 新增操作 slicemap 数据类型的标准库 slicesmaps,提供了操作 slicemap 的泛型函数。

本文我们介绍标准库 slicesmaps 的使用方式。

标准库 slices

标准库 slices 提供了许多操作任意类型元素 slice 的函数,可以方便我们实现业务需求。

建议感兴趣的读者朋友们阅读手册了解关于标准库 slices[1] 的所有函数的功能。

限于篇幅,我们介绍关于查找的函数的使用方式。

查找功能的函数 BinarySearchBinarySearchFunc

函数 BinarySearch 示例代码:

func main() {
 names := []string{"Alice", "Bob", "Vera"}
 n, found := slices.BinarySearch(names, "Vera")
 fmt.Println("Vera:", n, found)
 n, found = slices.BinarySearch(names, "Bill")
 fmt.Println("Bill:", n, found)
}

输出结果:

Vera: 2 true
Bill: 1 false

阅读上面这段代码,我们定义一个字符串元素类型的切片 names,使用标准库 slices 提供的二分查找函数 BinarySearch 查找 names 切片中的元素 Vera

该函数返回被查找元素在切片中的索引位置或被查找元素在切片中应该出现的位置,和被查找元素是否真实存在于切片中的一个布尔值。

什么是被查找元素在切片中应该出现的位置?示例代码中,查找 Bill,切片中没有该元素,按照切片中递增排序,Bill 应该在 Alice 后面,即索引为 1

需要注意的是,使用函数 BinarySearch 查找元素的切片,切片中的元素必须是按照递增顺序排序。

函数 BinarySearchFunc 示例代码:

func main() {
 type Person struct {
  Name string
  Age  int
 }
 people := []Person{
  {"Alice", 55},
  {"Bob", 24},
  {"Gopher", 13},
 }
 n, found := slices.BinarySearchFunc(people, Person{"Bob", 0}, func(a, b Person) int {
  return cmp.Compare(a.Name, b.Name)
 })
 fmt.Println("Bob:", n, found)
}

输出结果:

Bob: 1 true

阅读上面这段代码,函数 BinarySearchFunc 与 函数 BinarySearch 的功能类似,区别是可以使用自定义比较函数。

03

标准库 maps

标准库 maps 提供了许多操作任意类型 keyvaluemap 的函数,可以方便我们实现业务需求。

建议感兴趣的读者朋友们阅读手册了解关于标准库 maps[2] 的所有函数的功能。

限于篇幅,我们介绍关于比较两个 map 中的 keyvalue 是否相同的函数的使用方式。

func main() {
 m1 := map[string]int{"lucy": 17, "lily": 18}
 m2 := map[string]int{"lucy": 17, "lily": 18}
 m3 := map[string]int{"lucy": 18, "lily": 17}
 fmt.Println(maps.Equal(m1, m2))
 fmt.Println(maps.Equal(m1, m3))
}

输出结果:

true
false

阅读上面这段代码,我们定义三个 map 类型的变量,其中 m1m2keyvalue 完全相同,而 m3valuem1m2value 不同。

使用函数 Equal 比较,分别返回 truefalse

需要注意的是 mapkeyvalue 必须都是可比较的类型。

函数 EqualFunc 和函数 Equal 的功能类似,区别是使用 eq 比较 valuekey 仍然使用比较运算符 == 进行比较。

函数 EqualFunc 示例代码:

func main() {
 m1 := map[int]string{
  1:    "one",
  10:   "Ten",
  1000: "THOUSAND",
 }
 m2 := map[int][]byte{
  1:    []byte("One"),
  10:   []byte("Ten"),
  1000: []byte("Thousand"),
 }
 eq := maps.EqualFunc(m1, m2, func(v1 string, v2 []byte) bool {
  return strings.ToLower(v1) == strings.ToLower(string(v2))
 })
 fmt.Println(eq)
}

输出结果:

true

04

总结

本文我们简单介绍 Go 1.21.0 新增标准库 slicesmaps,标准库提供了一些操作 slicemap 的函数,限于篇幅,分别介绍 slices 的查找功能的函数,和 maps 的比较相同功能的函数。

建议读者朋友们,阅读文档,了解标准库提供的所有函数的功能和使用方式。


目录
相关文章
|
2月前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
14天前
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
|
17天前
|
JSON 安全 网络协议
go语言使用内置函数和标准库
【10月更文挑战第18天】
13 3
|
16天前
|
存储 Go
|
18天前
|
JSON 监控 安全
go语言选择合适的工具和库
【10月更文挑战第17天】
11 2
|
1月前
|
Linux 编译器 Go
cgo--在Go中链接外部C库
cgo--在Go中链接外部C库
|
3月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
130 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
3月前
|
存储 JSON 前端开发
一文搞懂 Go 1.21 的日志标准库 - slog
一文搞懂 Go 1.21 的日志标准库 - slog
109 2
|
3月前
|
Prometheus Cloud Native Go
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性
|
3月前
|
XML Go 数据库