1 回答

TA贡献1798条经验 获得超3个赞
您可以使用标准技巧在迭代时将切片中的内容向下移动,然后在最后截断。
j := 0
for _, v := range mySlice {
if v.key != "bb" && v.key != "yy" {
mySlice[j] = v
j++
}
}
mySlice = mySlice[:j]
这使用 O(1) 额外内存,并且效率很高。
在 go1.18 中,您将能够编写一个通用函数(通常称为过滤器)来进行切片。这是一个完整的示例,您也可以在 gotip 操场上运行。
package main
import "fmt"
// filter returns a slice (reusing the backing array of m), that
// contains all the elements of m for which f returns true.
func filter[T any](m []T, f func(*T) bool) []T {
j := 0
for i := range m {
if f(&m[i]) {
m[j] = m[i]
j++
}
}
return m[:j]
}
type data struct {
key string
value1 int
value2 string
}
func main() {
xs := []data{
{key: "aa", value1: 1, value2: "33"},
{key: "bb", value1: 23, value2: "333"},
{key: "cc", value1: 33, value2: "3366"},
{key: "yy", value1: 99, value2: "666"},
}
xs = filter(xs, func(x *data) bool { return x.key != "bb" && x.key != "yy" })
fmt.Println(xs)
}
- 1 回答
- 0 关注
- 88 浏览
添加回答
举报