我很难理解Go中interface{}类型的用法。

在这种情况下,我有一个函数,可以在某个位置的 slice 中间插入一个值。看起来像这样:

type mystruct {
    a, b, c int
}

func insert(ar []mystruct, val mystruct, i int) []mystruct {
    l := len(ar)
    if l == cap(ar) {
        tmp := make([]mystruct, l + 1, (l * 2) + 1)
        copy(tmp, ar[0:i])
        copy(tmp[i+1:], ar[i:])
        ar = tmp
    } else {
        ar = ar[0:l+1]
        copy(ar[i+1:], ar[i:])
    }
    ar[i] = val

    return ar
}

我希望该函数能够同时接受interface{}arval,以便我可以将其传递给任何类型的 slice 和值,并且它将执行插入操作而不会产生任何投诉。

到目前为止,我认为应该使用reflect包来完成。我已经阅读了《反射规则》以及有关反射和interface{}的各种教程,但是我不确定该如何处理。我想尽可能减少开销,我知道反射会降低代码速度,但是最有效的方法是什么?

谢谢!

最佳答案

不需要完整的“增长能力”代码。使用内置的append-它可以为您完全做到这一点。

将签名更改为:

func insert(ar interface{}, val interface{}, i int) interface{}

然后检查ar是一个slice,并且ar的元素类型与val相同:
at, vt := reflect.TypeOf(ar), reflect.Typeof(val)

if at.Kind() != reflect.Slice {
    panic(fmt.Sprintf("expected slice, got %T", at))
}

if at.Elem() != vt {
    panic("first argument must be a slice of the second argument's type")
}

类型验证后,保留一些reflect.Value:
av, vv := reflect.ValueOf(ar), reflect.ValueOf(val)

并使用以下方法移动内容:
  • (reflect.Value).Index(int)来访问 slice 的元素。
  • reflect.Copy与 slice àla内置copy相互复制和复制
  • reflect.Append附加到 slice Value
  • (reflect.Value).Set(reflect.Value)设置可设置元素的值(例如,您从 slice 中取出的东西)。
  • reflect.Appendreflect.AppendSlice附加到内置append slice 中。

  • 一旦您拥有代表结果 slice 的最终reflect.Value,将其作为interface{}返回,如下所示:
    return result.Interface()
    

    关于reflection - Golang : how to use interface{} type to insert a value into the middle of a slice?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28514046/

    10-16 10:58