我很难了解使用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
的教程,但我不知道如何处理这个问题。我希望尽可能减少开销,我理解反射会让代码慢一点,但最有效的方法是什么呢?
谢谢!
答案 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.Append
或reflect.AppendSlice
附加到内置append
的切片。一旦你的最终reflect.Value
代表结果切片;将其作为interface{}
返回,如下所示:
return result.Interface()