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 }