01
介绍
在 Go 语言项目开发中,我们经常会使用 slice
和 map
数据类型,因为 Go 1.18.0 开始支持泛型,所以 slice
的元素可能是任意类型,map
的 key
和 value
也可能是任意类型。
Go 1.21.0 新增操作 slice
和 map
数据类型的标准库 slices
和 maps
,提供了操作 slice
和 map
的泛型函数。
本文我们介绍标准库 slices
和 maps
的使用方式。
02
标准库 slices
标准库 slices
提供了许多操作任意类型元素 slice
的函数,可以方便我们实现业务需求。
建议感兴趣的读者朋友们阅读手册了解关于标准库 slices[1] 的所有函数的功能。
限于篇幅,我们介绍关于查找的函数的使用方式。
查找功能的函数 BinarySearch
和 BinarySearchFunc
。
函数 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)
}
输出结果:
代码语言:javascript复制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)
}
输出结果:
代码语言:javascript复制Bob: 1 true
阅读上面这段代码,函数 BinarySearchFunc
与 函数 BinarySearch
的功能类似,区别是可以使用自定义比较函数。
03
标准库 maps
标准库 maps
提供了许多操作任意类型 key
和 value
的 map
的函数,可以方便我们实现业务需求。
建议感兴趣的读者朋友们阅读手册了解关于标准库 maps[2] 的所有函数的功能。
限于篇幅,我们介绍关于比较两个 map
中的 key
和 value
是否相同的函数的使用方式。
函数 Equal
示例代码:
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))
}
输出结果:
代码语言:javascript复制true
false
阅读上面这段代码,我们定义三个 map
类型的变量,其中 m1
和 m2
的 key
和 value
完全相同,而 m3
的 value
与 m1
和 m2
的 value
不同。
使用函数 Equal
比较,分别返回 true
和 false
。
需要注意的是 map
的 key
和 value
必须都是可比较的类型。
函数 EqualFunc
和函数 Equal
的功能类似,区别是使用 eq 比较 value
。key
仍然使用比较运算符 ==
进行比较。
函数 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)
}
输出结果:
代码语言:javascript复制true
04
总结
本文我们简单介绍 Go 1.21.0 新增标准库 slices
和 maps
,标准库提供了一些操作 slice
和 map
的函数,限于篇幅,分别介绍 slices
的查找功能的函数,和 maps
的比较相同功能的函数。
建议读者朋友们,阅读文档,了解标准库提供的所有函数的功能和使用方式。