删除" nil"的最佳方式是什么?从接口{}切片中生成一个新的接口{}?
Slice := []interface{}{1, nil, "string", nil}
我没想到什么好事?
答案 0 :(得分:4)
newSlice := make([]interface{}, 0, len(Slice))
for _, item := range Slice {
if item != nil {
newSlice = append(newSlice, item)
}
}
答案 1 :(得分:1)
您也可以使用此示例中的类型开关:
slice := []interface{}{1, nil, "string", nil}
newSlice := make([]interface{}, 0, len(slice))
for _, val := range(slice){
switch val.(type) {
case string, int: // add your desired types which will fill newSlice
newSlice = append(newSlice, val)
}
}
fmt.Printf("newSlice: %v\tType: %T\n", newSlice, newSlice)
输出:
newSlice: [1 string] Type: []interface {}
中查看完整示例
答案 2 :(得分:0)
除非出于其他原因需要,否则无需分配新切片即可完成此操作:
things := []interface{}{
nil,
1,
nil,
"2",
nil,
3,
nil,
}
for i := 0; i < len(things); {
if things[i] != nil {
i++
continue
}
if i < len(things)-1 {
copy(things[i:], things[i+1:])
}
things[len(things)-1] = nil
things = things[:len(things)-1]
}
fmt.Printf("%v", things)
输出:
[1 2 3]