0

我很难将这段代码(实际上是切片上的左旋转)翻译成更通用的版本,该版本接受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 {})ais的值interface{},因此*a =将右手值分配给指针指向的空间。我的电话虽然AppendSlice返回。Value我不确定类型断言需要在哪里发生,我想在左侧?

4

2 回答 2

1

使用Value.Set设置切片中的值。

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))
}

使用指向切片的指针调用函数:

a := []string{"a", "b", "c", "d"}
roateSlice(&a, 2)

游乐场示例

于 2016-10-24T17:08:12.133 回答
1

a是一个interface{}非指针,所以你不能取消引用它。即使你有一个指向切片的指针,你也不能分配 的结果reflect.AppendSlice,因为它返回 type 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))
}
于 2016-10-24T17:08:26.537 回答