网站单页源码,全网推广怎么做,贵阳网站建设公司排名,广州公关公司排行榜Go 1.21新增的 slices 包提供了很多和切片相关的函数#xff0c;可以用于任何类型的切片。
slices.Delete
定义如下#xff1a;
func Delete[S ~[]E, E any](s S, i, j int) S
从 s 中删除元素 s[i:j]#xff0c;返回修改后的切片。如果 s[i:j] 不是 s 的有效切片#…Go 1.21新增的 slices 包提供了很多和切片相关的函数可以用于任何类型的切片。
slices.Delete
定义如下
func Delete[S ~[]E, E any](s S, i, j int) S
从 s 中删除元素 s[i:j]返回修改后的切片。如果 s[i:j] 不是 s 的有效切片则会 panic。Delete是 O(len(s)-j)因此如果必须删除许多项最好调用一次删除全部而不是逐个删除。Delete不能修改元素 s[len(s)-(j-i):len(s)]。如果这些元素包含指针可以考虑将这些元素归零以便它们引用的对象可以被垃圾回收。简单示例如下
package mainimport (fmtslices
)func main() {letters : []string{a, b, c, d, e}letters slices.Delete(letters, 1, 4)fmt.Println(letters) // [a e]}slices.DeleteFunc
定义如下
func DeleteFunc[S ~[]E, E any](s S, del func(E) bool) S
从 s 中删除 del函数返回 true 的元素并返回修改后的切片。当 DeleteFunc 删除m个元素时它可能不会修改元素s[len(s)-m:len(s)]。如果这些元素包含指针、可以考虑将这些元素归零以便它们引用的对象可以被垃圾回收。简单示例如下
package mainimport (fmtslices
)func main() {seq : []int{0, 1, 1, 2, 3, 5, 8}seq slices.DeleteFunc(seq, func(n int) bool {return n%2 ! 0 // 删除奇数})fmt.Println(seq) // [0 2 8]
}slices.Equal
定义如下
func Equal[S ~[]E, E comparable](s1, s2 S) bool
判断两个切片是否相等长度相同且所有元素相等。如果长度不同返回 false。如果长度相同将按索引递增的顺序比较元素并在第一个不相等出现时停止比较。简单示例如下
package mainimport (fmtslices
)func main() {numbers : []int{0, 42, 8}fmt.Println(slices.Equal(numbers, []int{0, 42, 8})) // truefmt.Println(slices.Equal(numbers, []int{10})) // false
}
slices.EqualFunc
定义如下
func EqualFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, eq func(E1, E2) bool) bool
对每对元素使用自定义函数来判断两个片是否相等。如果长度不同返回false。如果长度相同将按索引递增的顺序比较元素并在 eq 返回 false 的第一个索引处停止比较。简单示例如下
package mainimport (fmtslicesstrconv
)func main() {numbers : []int{0, 42, 8}strings : []string{000, 42, 0o10}equal : slices.EqualFunc(numbers, strings, func(n int, s string) bool {sn, err : strconv.ParseInt(s, 0, 64)if err ! nil {return false}return n int(sn)})fmt.Println(equal) // true
}
slices.Grow
定义如下
func Grow[S ~[]E, E any](s S, n int) S
增加片的容量以为另外 n 个元素提供空间。在Grow(n)之后至少可以将n个元素添加到片中而无需再进行分配。如果 n 为负值或太大而无法分配内存就会 panic。
slices.Index
定义如下
func Index[S ~[]E, E comparable](s S, v E) int
返回 v 在 s 中第一次出现的索引如果不存在则返回-1。简单示例如下
package mainimport (fmtslices
)func main() {numbers : []int{0, 42, 8}fmt.Println(slices.Index(numbers, 8)) // 2fmt.Println(slices.Index(numbers, 7)) // -1
}
slices.IndexFunc
定义如下
func IndexFunc[S ~[]E, E any](s S, f func(E) bool) int
返回第一个满足 f(s[i]) 的索引 i如果不满足则返回-1。简单示例如下
package mainimport (fmtslices
)func main() {numbers : []int{0, 42, -10, 8}i : slices.IndexFunc(numbers, func(n int) bool {return n 0})fmt.Println(First negative at index, i) // 2
}
slices.Insert
定义如下
func Insert[S ~[]E, E any](s S, i int, v ...E) S
将 值 v… 在索引 i 处插入到 s返回修改后的切片。s[i:] 中的元素被上移以腾出空间。在返回的切片 r 中r[i] v[0] r[ilen(v)] 原来在 r[i] 处的 value。如果超出范围则 panic。这个函数的复杂度为 O(len(s) len(v))。简单示例如下
package mainimport (fmtslices
)func main() {names : []string{Alice, Bob, Vera}names slices.Insert(names, 1, Bill, Billie)names slices.Insert(names, len(names), Zac)fmt.Println(names) // [Alice Bill Billie Bob Vera Zac]
}
slices.IsSorted
定义如下
func IsSorted[S ~[]E, E cmp.Ordered](x S) bool
判断 x 是否按升序排序。简单示例如下
package mainimport (fmtslices
)func main() {fmt.Println(slices.IsSorted([]string{Alice, Bob, Vera})) // truefmt.Println(slices.IsSorted([]int{0, 2, 1})) // false
}
【参考资料】
Package sliceshttps://golang.google.cn/pkg/slices/