Go 1.21新增的slices包中切片函數(shù)用法詳解
slices.Max
定義如下:
func Max[S ~[]E, E cmp.Ordered](x S) E
返回 x 中的最大值,如果 x 為空,則 panic。對于浮點數(shù) E, 如果有元素為 NaN,結果就是 NaN。簡單示例如下:
package main
import (
"fmt"
"math"
"slices"
)
func main() {
numbers := []int{0, 10, -1, 8}
fmt.Println(slices.Max(numbers)) // 10
numbers2 := []float64{0, 10, -1, 8, math.NaN()}
fmt.Println(slices.Max(numbers2)) // NaN
}slices.MaxFunc
定義如下:
func MaxFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E
返回 x 中的最大值,使用 cmp 函數(shù)來比較元素,如果 x 為空,則 panic。如果根據(jù) cmp 函數(shù)計算后有多個最大元素,返回第一個。簡單示例如下:
package main
import (
"cmp"
"fmt"
"slices"
)
func main() {
type Person struct {
Name string
Age int
}
people := []Person{
{"Gopher", 13},
{"Alice", 55},
{"Vera", 24},
{"Bob", 55},
}
firstOldest := slices.MaxFunc(people, func(a, b Person) int {
return cmp.Compare(a.Age, b.Age)
})
fmt.Println(firstOldest.Name) // Alice
}slices.Min
定義如下:
func Min[S ~[]E, E cmp.Ordered](x S) E
返回 x 中的最小值,如果 x 為空,則 panic。對于浮點數(shù) E, 如果有元素為 NaN,結果就是 NaN。簡單示例如下:
package main
import (
"fmt"
"math"
"slices"
)
func main() {
numbers := []int{0, 10, -1, 8}
fmt.Println(slices.Min(numbers)) // -1
numbers2 := []float64{0, 10, -1, 8, math.NaN()}
fmt.Println(slices.Min(numbers2)) // NaN
}slices.MinFunc
定義如下:
func MinFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E
返回 x 中的最小值,使用 cmp 函數(shù)來比較元素,如果 x 為空,則 panic。如果根據(jù) cmp 函數(shù)計算后有多個最小元素,返回第一個。簡單示例如下:
package main
import (
"cmp"
"fmt"
"slices"
)
func main() {
type Person struct {
Name string
Age int
}
people := []Person{
{"Gopher", 13},
{"Alice", 55},
{"Vera", 24},
{"Bob", 55},
}
firstYoungest := slices.MinFunc(people, func(a, b Person) int {
return cmp.Compare(a.Age, b.Age)
})
fmt.Println(firstYoungest.Name) // Gopher
}slices.Replace
定義如下:
func Replace[S ~[]E, E any](s S, i, j int, v ...E) S
將元素 s[i:j] 替換為給定的 v,并返回修改后的切片。如果 s[i:j] 不是 s 的一部分,則 panic。簡單示例如下:
package main
import (
"fmt"
"slices"
)
func main() {
names := []string{"Alice", "Bob", "Vera", "Zac"}
names = slices.Replace(names, 1, 3, "Bill", "Billie", "Cat")
fmt.Println(names) // [Alice Bill Billie Cat Zac]
}slices.Reverse
定義如下:
func Reverse[S ~[]E, E any](s S)
反轉切片中的元素。簡單示例如下:
package main
import (
"fmt"
"slices"
)
func main() {
names := []string{"alice", "Bob", "VERA"}
slices.Reverse(names)
fmt.Println(names) // [VERA Bob alice]
}slices.Sort
定義如下:
func Sort[S ~[]E, E cmp.Ordered](x S)
對有序類型的切片進行升序排序。對于浮點數(shù)類型,NaN 排在其它值之前。簡單示例如下:
package main
import (
"fmt"
"math"
"slices"
)
func main() {
s1 := []int8{0, 42, -10, 8}
slices.Sort(s1)
fmt.Println(s1) // [-10 0 8 42]
s2 := []float64{0, math.NaN(), -10, 8, math.NaN()}
slices.Sort(s2)
fmt.Println(s2) // [NaN NaN -10 0 8]
}slices.SortFunc
定義如下:
func SortFunc[S ~[]E, E any](x S, cmp func(a, b E) int)
按照 cmp 函數(shù)確定的升序對切片 x 進行排序,這種排序不能保證穩(wěn)定。Cmp (a, b) 函數(shù)應該在 a < b 時返回一個負數(shù),在 a > b 時返回一個正數(shù),在 a == b 時返回零。SortFunc 要求 cmp 函數(shù)是嚴格的弱排序類型。簡單示例如下:
package main
import (
"cmp"
"fmt"
"slices"
"strings"
)
func main() {
names := []string{"Bob", "alice", "VERA"}
slices.SortFunc(names, func(a, b string) int {
return cmp.Compare(strings.ToLower(a), strings.ToLower(b))
})
fmt.Println(names) // [alice Bob VERA]
}slices.SortStableFunc
定義如下:
func SortStableFunc[S ~[]E, E any](x S, cmp func(a, b E) int)
對切片 x 進行排序,同時保持相等元素的原始順序,使用 cmp 以與 SortFunc 相同的方式比較元素。簡單示例如下:
package main
import (
"cmp"
"fmt"
"slices"
)
func main() {
type Person struct {
Name string
Age int
}
people := []Person{
{"Gopher", 13},
{"Alice", 20},
{"Bob", 24},
{"Alice", 55},
}
// Stable sort by name, keeping age ordering of Alices intact
slices.SortStableFunc(people, func(a, b Person) int {
return cmp.Compare(a.Name, b.Name)
})
fmt.Println(people) // [{Alice 20} {Alice 55} {Bob 24} {Gopher 13}]
}到此這篇關于Go 1.21新增的slices包中切片函數(shù)用法詳解的文章就介紹到這了,更多相關Go 1.21 slices包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go中的函數(shù)選項模式(Functional Options Pattern)詳解
在 Go 語言中,函數(shù)選項模式是一種優(yōu)雅的設計模式,用于處理函數(shù)的可選參數(shù),本文將對其進行講解,準備好了嗎,快跟隨著本文一探究竟吧2023-06-06
Golang?Fasthttp選擇使用slice而非map?存儲請求數(shù)據(jù)原理探索
本文將從簡單到復雜,逐步剖析為什么?Fasthttp?選擇使用?slice?而非?map,并通過代碼示例解釋這一選擇背后高性能的原因,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-02-02
執(zhí)行go?build報錯go:?go.mod?file?not?found?in?current?dir
本文主要為大家介紹了執(zhí)行go build報錯go:?go.mod?file?not?found?in?current?directory?or?any?parent?directory解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06

