go-ml.dev/pkg/base@v0.0.0-20200610162856-60c38abac71b/fu/reverse.go (about)

     1  package fu
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  )
     7  
     8  func Reverse(slice interface{}) {
     9  	v := reflect.ValueOf(slice)
    10  	if v.Kind() != reflect.Slice {
    11  		panic(fmt.Sprintf("slice must have a slice type, but %v", v.Type()))
    12  	}
    13  	L := v.Len()
    14  	for i := 0; i <= int((L-1)/2); i++ {
    15  		reverseIndex := L - 1 - i
    16  		tmp := v.Index(reverseIndex).Interface()
    17  		v.Index(reverseIndex).Set(v.Index(i))
    18  		v.Index(i).Set(reflect.ValueOf(tmp))
    19  	}
    20  }
    21  
    22  func Reversed(slice interface{}) interface{} {
    23  	v := reflect.ValueOf(slice)
    24  	if v.Kind() != reflect.Slice && v.Kind() != reflect.Array {
    25  		panic(fmt.Sprintf("slice must have a slice/array type, but %v", v.Type()))
    26  	}
    27  	L := v.Len()
    28  	o := reflect.MakeSlice(reflect.SliceOf(v.Type().Elem()), L, L)
    29  	reflect.Copy(o, v)
    30  	Reverse(o.Interface())
    31  	return o.Interface()
    32  }