Go 如何仅使用1种方法删除不同类型的切片

Go 如何仅使用1种方法删除不同类型的切片,go,slice,type-assertion,Go,Slice,Type Assertion,我有两个go函数,如下所示 func removeL2McEntry(a []api.L2McEntry, index int) []api.L2McEntry { a = append(a[:index], a[index+1:]...) element return a[:len(a)] } func removeVlagBasedGroup(a []api.VlanPortBased, index int) []api.VlanPortBased {

我有两个go函数,如下所示

 func removeL2McEntry(a []api.L2McEntry, index int) []api.L2McEntry {
    a = append(a[:index], a[index+1:]...) 
    element
    return a[:len(a)]
 }

 func removeVlagBasedGroup(a []api.VlanPortBased, index int) []api.VlanPortBased {
    a = append(a[:index], a[index+1:]...) 
    return a[:len(a)]
 }
正如您所看到的,这两个函数所做的工作是相同的。但是我需要将它们分开,因为函数的输出和输入是不同的类型

我试过:

func removeSlice(a interface{}, idx int) interface{} {
    switch v := a.(type) { 
    case []string:
        v = append(v[:idx], v[idx+1:]...) 
        fmt.Println("is ary", v)
        return v[:len(v)]
    case []int:
        v = append(v[:idx], v[idx+1:]...) 
        fmt.Println("is ary", v)
        return v[:len(v)]
    default:

    }
    return nil
}
但是这种方式有太多重复的代码。 有没有办法让它只包含一个函数并减少重复代码


提前感谢。

正如Adrian所指出的,从切片中删除元素通常是一行代码:

a = append(a[:i], a[i+1]...)
// or
a = a[:i+copy(a[i:], a[i+1:])]
为它编写函数并不值得,只需在需要的地方使用此代码段即可

如果您确实需要创建一个可以处理任何切片类型的函数,那么可以使用反射来创建它。但是在使用它时,必须对结果使用类型断言,因为函数只能返回一个静态类型
interface{}
。它也会比在具体的切片值上使用上面的代码片段慢

上述移除步骤可使用该软件包“复制”。切片是方法,追加操作是函数

这就是它的样子(省略类型和绑定检查):

测试它:

is := []int{0, 1, 2, 3}
is = remove(is, 2).([]int)
fmt.Printf("%#v\n", is)

ss := []string{"0", "1", "2", "3"}
ss = remove(ss, 2).([]string)
fmt.Printf("%#v\n", ss)
输出(在上尝试):


但是再次强调:我不建议任何人使用这段代码(尽管可以工作),只需直接用原始代码片段删除元素。

泛型可以解决这个问题。Go没有泛型。你可以搜索更多关于这个事实的信息。你的函数只替换了一行代码,什么也不保存,把它变成函数有什么意义呢?而且,
a[:len(a)]
是不必要的。对于数组到切片的转换,您可以使用
a[:]
来获取整个内容,但是由于它已经是一个切片,所以这不起任何作用;它完全等同于
a
,但有额外的不必要的处理。请注意,使用反射操作要比简单的切片操作慢。@Adrian是的,值得注意。我不建议任何人使用此代码,它只是出于“教育”目的。@Adrian谢谢你的解释和时间,我在围棋方面没有太多经验。你解释得非常准确,再次感谢。
is := []int{0, 1, 2, 3}
is = remove(is, 2).([]int)
fmt.Printf("%#v\n", is)

ss := []string{"0", "1", "2", "3"}
ss = remove(ss, 2).([]string)
fmt.Printf("%#v\n", ss)
[]int{0, 1, 3}
[]string{"0", "1", "3"}