Golang:如何使用interface {}类型将值插入切片的中间?

时间:2015-02-14 08:59:41

标签: reflection go

我很难了解使用Go的<{1}}类型。

在这个例子中,我有一个函数可以在某个切片的中间插入一个值。它看起来像这样:

interface{}

我希望该函数能够接受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{}的{​​{1}},以便我可以传递任何类型的切片和值,它会执行插件没有抱怨。

从我到目前为止所读到的内容,我认为应该使用ar包来完成。我已经阅读了反思规则和各种关于反思和val的教程,但我不知道如何处理这个问题。我希望尽可能减少开销,我理解反射会让代码慢一点,但最有效的方法是什么呢?

谢谢!

1 个答案:

答案 0 :(得分:1)

整个“容量增长”代码是不必要的;使用内置的append - 它完全适合你。

将签名更改为:

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

然后检查ar是否为切片,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 s:

av, vv := reflect.ValueOf(ar), reflect.ValueOf(val)

使用例如:

来获取移动的东西
  • (reflect.Value).Index(int)访问切片的元素。
  • reflect.Copy要复制到内置copy
  • 的切片中
  • reflect.Append附加到切片Value
  • (reflect.Value).Set(reflect.Value)设置可设置元素的值(例如,您从切片中获取的内容)。
  • reflect.Appendreflect.AppendSlice附加到内置append的切片。

一旦你的最终reflect.Value代表结果切片;将其作为interface{}返回,如下所示:

return result.Interface()