我很难理解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{}
和ar
的val
,以便我可以将其传递给任何类型的 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.Append
或reflect.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/