在 Go 語(yǔ)言項(xiàng)目開(kāi)發(fā)中,我們經(jīng)常會(huì)使用 slice 和 map 數(shù)據(jù)類型,因?yàn)?Go 1.18.0 開(kāi)始支持泛型,所以 slice 的元素可能是任意類型,map 的 key 和 value 也可能是任意類型。
Go 1.21.0 新增操作 slice 和 map 數(shù)據(jù)類型的標(biāo)準(zhǔn)庫(kù) slices 和 maps,提供了操作 slice 和 map 的泛型函數(shù)。
本文我們介紹標(biāo)準(zhǔn)庫(kù) slices 和 maps 的使用方式。
標(biāo)準(zhǔn)庫(kù) slices 提供了許多操作任意類型元素 slice 的函數(shù),可以方便我們實(shí)現(xiàn)業(yè)務(wù)需求。
建議感興趣的讀者朋友們閱讀手冊(cè)了解關(guān)于標(biāo)準(zhǔn)庫(kù) slices[1] 的所有函數(shù)的功能。
限于篇幅,我們介紹關(guān)于查找的函數(shù)的使用方式。
查找功能的函數(shù) BinarySearch 和 BinarySearchFunc。
函數(shù) 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)}
輸出結(jié)果:
Vera: 2 trueBill: 1 false
閱讀上面這段代碼,我們定義一個(gè)字符串元素類型的切片 names,使用標(biāo)準(zhǔn)庫(kù) slices 提供的二分查找函數(shù) BinarySearch 查找 names 切片中的元素 Vera。
該函數(shù)返回被查找元素在切片中的索引位置或被查找元素在切片中應(yīng)該出現(xiàn)的位置,和被查找元素是否真實(shí)存在于切片中的一個(gè)布爾值。
什么是被查找元素在切片中應(yīng)該出現(xiàn)的位置?示例代碼中,查找 Bill,切片中沒(méi)有該元素,按照切片中遞增排序,Bill 應(yīng)該在 Alice 后面,即索引為 1。
需要注意的是,使用函數(shù) BinarySearch 查找元素的切片,切片中的元素必須是按照遞增順序排序。
函數(shù) 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)}
輸出結(jié)果:
Bob: 1 true
閱讀上面這段代碼,函數(shù) BinarySearchFunc 與 函數(shù) BinarySearch 的功能類似,區(qū)別是可以使用自定義比較函數(shù)。
標(biāo)準(zhǔn)庫(kù) maps 提供了許多操作任意類型 key 和 value 的 map 的函數(shù),可以方便我們實(shí)現(xiàn)業(yè)務(wù)需求。
建議感興趣的讀者朋友們閱讀手冊(cè)了解關(guān)于標(biāo)準(zhǔn)庫(kù) maps[2] 的所有函數(shù)的功能。
限于篇幅,我們介紹關(guān)于比較兩個(gè) map 中的 key 和 value 是否相同的函數(shù)的使用方式。
函數(shù) 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))}
輸出結(jié)果:
truefalse
閱讀上面這段代碼,我們定義三個(gè) map 類型的變量,其中 m1 和 m2 的 key 和 value 完全相同,而 m3 的 value 與 m1 和 m2 的 value 不同。
使用函數(shù) Equal 比較,分別返回 true 和 false。
需要注意的是 map 的 key 和 value 必須都是可比較的類型。
函數(shù) EqualFunc 和函數(shù) Equal 的功能類似,區(qū)別是使用 eq 比較 value。key 仍然使用比較運(yùn)算符 == 進(jìn)行比較。
函數(shù) 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)}
輸出結(jié)果:
true
本文我們簡(jiǎn)單介紹 Go 1.21.0 新增標(biāo)準(zhǔn)庫(kù) slices 和 maps,標(biāo)準(zhǔn)庫(kù)提供了一些操作 slice 和 map 的函數(shù),限于篇幅,分別介紹 slices 的查找功能的函數(shù),和 maps 的比較相同功能的函數(shù)。
建議讀者朋友們,閱讀文檔,了解標(biāo)準(zhǔn)庫(kù)提供的所有函數(shù)的功能和使用方式。
本文鏈接:http://www.www897cc.com/showinfo-26-11850-0.htmlGo 1.21.0 新增標(biāo)準(zhǔn)庫(kù) Slices 和 Mps 詳解
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com