Go1.21新增slices包的用法詳解
slices.BinarySearch
定義如下:
func BinarySearch[S ~[]E, E cmp.Ordered](x S, target E) (int, bool)
在已經(jīng)排好序的切片(切片必須按遞增順序排序)中搜索目標(biāo),如果找到了,返回所在的位置和 true,如果沒有找到,則返回目標(biāo)應(yīng)該被找到的位置和 false,簡(jiǎn)單示例如下:
package main import ( "fmt" "slices" ) func main() { names := []string{"Alice", "Bob", "Vera"} n, found := slices.BinarySearch(names, "Vera") fmt.Println("Vera:", n, found) // Vera: 2 true n, found = slices.BinarySearch(names, "Bill") fmt.Println("Bill:", n, found) // Bill: 1 false }
slices.BinarySearchFunc
定義如下:
func BinarySearchFunc[S ~[]E, E, T any](x S, target T, cmp func(E, T) int) (int, bool)
作用類似 slices.BinarySearch,不同的是使用自定義比較函數(shù)。切片必須按遞增順序排序,其中“遞增”是由cmp定義的。如果 slice 元素與目標(biāo)匹配,CMP應(yīng)該返回 0,如果 slice元素在目標(biāo)之前,則返回一個(gè)負(fù)數(shù),如果 slice 元素在目標(biāo)之后,則返回一個(gè)正數(shù)。CMP必須實(shí)現(xiàn)與片相同的排序,這樣,如果CMP (a, t) < 0且CMP (b, t) >= 0,則切中的 a 必須位于 b 之前。
package main import ( "cmp" "fmt" "slices" ) 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 }
slices.Clip
定義如下:
func Clip[S ~[]E, E any](s S) S
從切片中刪除未使用的容量,返回 s[:len(s):len(s)]。簡(jiǎn)單示例如下:
package main import ( "fmt" "slices" ) func main() { names := make([]string, 2, 5) names = slices.Clip(names) fmt.Printf("長(zhǎng)度:%d,容量:%d", len(names), cap(names)) // 長(zhǎng)度:2,容量:2 }
slices.Clone
定義如下:
func Clone[S ~[]E, E any](s S) S
返回切片的副本。因?yàn)樵厥鞘褂觅x值方式復(fù)制的,所以這是一個(gè)淺克隆。簡(jiǎn)單實(shí)用方法如下:
package main import ( "fmt" "slices" ) func main() { names := []string{"路多辛的博客", "路多辛的所思所想"} namesCopy := slices.Clone(names) fmt.Println(namesCopy) }
slices.Compact
定義如下:
func Compact[S ~[]E, E comparable](s S) S
將連續(xù)出現(xiàn)的元素變?yōu)橐粋€(gè),類似于 Unix 上的 uniq 命令。Compact 會(huì)修改片的內(nèi)容并返回修改后的片,長(zhǎng)度可能會(huì)變得更小。簡(jiǎn)單示例如下:
package main import ( "fmt" "slices" ) func main() { seq := []int{0, 1, 1, 2, 5, 5, 5, 8} seq = slices.Compact(seq) fmt.Println(seq) // [0 1 2 5 8] }
slices.CompactFunc
定義如下:
func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S
類似于 slices.Compact,不同的是使用自定義的函數(shù)來(lái)比較元素。如果元素的運(yùn)行結(jié)果相等,CompactFunc 將保留第一個(gè)元素。簡(jiǎn)單示例如下:
package main import ( "fmt" "slices" "strings" ) func main() { names := []string{"bob", "Bob", "alice", "Vera", "VERA"} names = slices.CompactFunc(names, func(a, b string) bool { return strings.ToLower(a) == strings.ToLower(b) }) fmt.Println(names) // [bob alice Vera] }
slices.Compare
定義如下:
func Compare[S ~[]E, E cmp.Ordered](s1, s2 S) int
使用 cmp.Compare函數(shù)來(lái)比較 s1 和 s2 的元素。按照順序比較每一對(duì)元素,直到一個(gè)元素不等于另一個(gè)元素。返回第一個(gè)不匹配元素的結(jié)果。如果兩個(gè)切片在其中一個(gè)結(jié)束之前相等,則認(rèn)為較短的切片小于較長(zhǎng)的切片。如果 s1 == s2,結(jié)果為0;如果 s1 < s2,結(jié)果為-1;如果 s1 > s2,結(jié)果為1。
package main import ( "fmt" "slices" ) func main() { names := []string{"Alice", "Bob", "Vera"} fmt.Println("Equal:", slices.Compare(names, []string{"Alice", "Bob", "Vera"})) fmt.Println("V < X:", slices.Compare(names, []string{"Alice", "Bob", "Xena"})) fmt.Println("V > C:", slices.Compare(names, []string{"Alice", "Bob", "Cat"})) fmt.Println("3 > 2:", slices.Compare(names, []string{"Alice", "Bob"})) }
運(yùn)行結(jié)果如下:
Equal: 0
V < X: -1
V > C: 1
3 > 2: 1
slices.CompareFunc
定義如下:
func CompareFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, cmp func(E1, E2) int) int
類似于 slices.Compare,不同的是使用自定義的比較函數(shù)進(jìn)行比較。結(jié)果是 cmp 的第一個(gè)非零結(jié)果;如果 cmp 總是返回0,則如果 len(s1) == len(s2) 結(jié)果為0,如果len(s1) < len(s2)結(jié)果為-1,如果 len(s1) > len(s2) 結(jié)果為1。簡(jiǎn)單示例如下:
package main import ( "cmp" "fmt" "slices" "strconv" ) func main() { numbers := []int{0, 43, 8} strings := []string{"0", "0", "8"} result := slices.CompareFunc(numbers, strings, func(n int, s string) int { sn, err := strconv.Atoi(s) if err != nil { return 1 } return cmp.Compare(n, sn) }) fmt.Println(result) // 1 }
slices.Contains
定義如下:
func Contains[S ~[]E, E comparable](s S, v E) bool
用于判斷 s 是否包含 v。簡(jiǎn)單示例如下:
package main import ( "fmt" "slices" ) func main() { names := []string{"Alice", "Bob", "Vera"} fmt.Println(slices.Contains(names, "Bob")) // true }
slices.ContainsFunc
定義如下:
func ContainsFunc[S ~[]E, E any](s S, f func(E) bool) bool
用于判斷 s 中是否至少有一個(gè)元素 e 滿足 f(e)。簡(jiǎn)單示例如下:
package main import ( "fmt" "slices" ) func main() { numbers := []int{0, 42, -10, 8} hasNegative := slices.ContainsFunc(numbers, func(n int) bool { return n < 0 }) fmt.Println("Has a negative:", hasNegative)// true hasOdd := slices.ContainsFunc(numbers, func(n int) bool { return n%2 != 0 }) fmt.Println("Has an odd number:", hasOdd) // false }
【參考資料】
Package slices(https://golang.google.cn/pkg/slices/)
以上就是Go1.21新增slices包的用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Go1.21 slices包的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go redis實(shí)現(xiàn)滑動(dòng)窗口限流的方式(redis版)
這篇文章主要介紹了go redis實(shí)現(xiàn)滑動(dòng)窗口限流的方式(redis版),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12詳解Golang?ProtoBuf的基本語(yǔ)法總結(jié)
最近項(xiàng)目是采用微服務(wù)架構(gòu)開發(fā)的,各服務(wù)之間通過gPRC調(diào)用,基于ProtoBuf序列化協(xié)議進(jìn)行數(shù)據(jù)通信,因此接觸學(xué)習(xí)了Protobuf,本文會(huì)對(duì)Protobuf的語(yǔ)法做下總結(jié),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助2022-10-10golang結(jié)合mysql設(shè)置最大連接數(shù)和最大空閑連接數(shù)
本文介紹golang?中連接MySQL時(shí),如何設(shè)置最大連接數(shù)和最大空閑連接數(shù),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02使用Go語(yǔ)言創(chuàng)建WebSocket服務(wù)的實(shí)現(xiàn)示例
這篇文章主要介紹了使用Go語(yǔ)言創(chuàng)建WebSocket服務(wù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Golang HTTP 服務(wù)平滑重啟及升級(jí)的思路
Golang HTTP服務(wù)在上線時(shí),需要重新編譯可執(zhí)行文件,關(guān)閉正在運(yùn)行的進(jìn)程,然后再啟動(dòng)新的運(yùn)行進(jìn)程。這篇文章主要介紹了Golang HTTP 服務(wù)平滑重啟及升級(jí),需要的朋友可以參考下2020-04-04