Golang反转任意切片

时间:2019-02-25 02:01:33

标签: go

var Reverse = func(slice interface{}) {
    s := reflect.ValueOf(slice)
    // if s is a pointer of slice
    if s.Kind() == reflect.Ptr {
        s = s.Elem()
    }
    i := 0
    j := s.Len() - 1
    for i < j {
        x, y := s.Index(i).Interface(), 
           s.Index(j).Interface()
        s.Index(i).Set(reflect.ValueOf(y))
        s.Index(j).Set(reflect.ValueOf(x))
        i++
        j--
    }
}

我发现这种方式行得通,但这并不优雅.... 我知道反射包中有一个方法“ Swapper”。但是,如果上面函数的参数是slice的指针,我不知道如何使其工作。

真的很感激。

1 个答案:

答案 0 :(得分:0)

您的代码可以正常工作。要使用reflect.Swapper,只需将s.Interface()传递给它:

var Reverse = func(slice interface{}) {
    s := reflect.ValueOf(slice)
    // if s is a pointer of slice
    if s.Kind() == reflect.Ptr {
        s = s.Elem()
    }
    swp := reflect.Swapper(s.Interface())
    for i,j :=0,s.Len() - 1; i<j; i,j = i+1,j-1 {
        swp(i,j)
    }
}

游乐场:https://play.golang.org/p/DSq_iZRZX4b