Go 1.21.0 新增標準庫 Slices 和 Mps 詳解
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)
}
輸出結果:
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 提供了許多操作任意類型 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))
}
輸出結果:
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)
}
輸出結果:
true
04、總結
本文我們簡單介紹 Go 1.21.0 新增標準庫 slices 和 maps,標準庫提供了一些操作 slice 和 map 的函數,限于篇幅,分別介紹 slices 的查找功能的函數,和 maps 的比較相同功能的函數。
建議讀者朋友們,閱讀文檔,了解標準庫提供的所有函數的功能和使用方式。