Golang从接口切片中删除nil {}

时间:2016-11-30 22:37:22

标签: go slice

删除" nil"的最佳方式是什么?从接口{}切片中生成一个新的接口{}?

 Slice := []interface{}{1, nil, "string", nil}

我没想到什么好事?

3 个答案:

答案 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 {}

您可以在The Go Playground

中查看完整示例

答案 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]

您可以使用该here,并找到有关切片操作here的更多信息。