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的指针,我不知道如何使其工作。
真的很感激。
答案 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)
}
}