作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我在将这段代码(实际上是在 slice 上左旋转)翻译成接受 interface{}
作为输入参数的更通用的版本时遇到了麻烦。
func rotate(a *[]int, i int) {
x, b := (*a)[:i], (*a)[i:]
*a = append(b, x...)
}
我在期末作业上遇到了麻烦:
func rotateSlice(a interface{}, i int) {
v := reflect.ValueOf(a)
x, b := v.Elem().Slice(0, i), v.Elem().Slice(i, v.Elem().Len())
*a = reflect.AppendSlice(b, x)
}
错误信息是invalid indirect of a (type {})
。 a
的值为 interface{}
,因此 *a =
会将右侧的值分配给指针所在的空间指向。不过,我对 AppendSlice
的调用返回了 Value
。我不确定类型断言需要在哪里发生,我想是在左侧吗?
最佳答案
a
是一个接口(interface){}
,而不是指针,因此您不能取消引用它。即使你有一个指向 slice 的指针,你也不能分配 reflect.AppendSlice
的结果,因为它返回类型 reflect.Value
。您需要通过 Value.Set
设置值.
https://play.golang.org/p/JCF8jsRJ_O
func rotateSlice(a interface{}, i int) {
v := reflect.ValueOf(a).Elem()
x, b := v.Slice(0, i), v.Slice(i, v.Len())
v.Set(reflect.AppendSlice(b, x))
}
关于pointers - 将 reflect.AppendSlice 的结果分配给指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40223698/
我在将这段代码(实际上是在 slice 上左旋转)翻译成接受 interface{} 作为输入参数的更通用的版本时遇到了麻烦。 func rotate(a *[]int, i int) { x
我想reflect.New 一个[]interface{},比如[]int,并将它追加到另一个 slice 中。 我的代码肯定有错误,但我不知道如何改正,也不知道如何深入理解reflect.New和r
我是一名优秀的程序员,十分优秀!