Go 1.21新增的slices包中切片函数用法详解
作者:路多辛
slices.Max
定义如下:
func Max[S ~[]E, E cmp.Ordered](x S) E
返回 x 中的最大值,如果 x 为空,则 panic。对于浮点数 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 函数来比较元素,如果 x 为空,则 panic。如果根据 cmp 函数计算后有多个最大元素,返回第一个。简单示例如下:
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。对于浮点数 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 函数来比较元素,如果 x 为空,则 panic。如果根据 cmp 函数计算后有多个最小元素,返回第一个。简单示例如下:
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)
对有序类型的切片进行升序排序。对于浮点数类型,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 函数确定的升序对切片 x 进行排序,这种排序不能保证稳定。Cmp (a, b) 函数应该在 a < b 时返回一个负数,在 a > b 时返回一个正数,在 a == b 时返回零。SortFunc 要求 cmp 函数是严格的弱排序类型。简单示例如下:
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包中切片函数用法详解的文章就介绍到这了,更多相关Go 1.21 slices包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!