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 關注
- 104 瀏覽
添加回答
舉報