func toInterfaces(values []reflect.Value) []interface{} {
	interfaces := make([]interface{}, len(values))
	for i := range values {
		interfaces[i] = values[i].Interface()
	}
	return interfaces
}
toInterfaces returns a slice of the interfaces behinnd values
package compare
import (
	"fmt"
	"reflect"
)
func NoOrder(v1, v2 interface{}) bool {
	if v1 == nil || v2 == nil {
		return v1 == v2
	}
	type1 := reflect.TypeOf(v1)
	type2 := reflect.TypeOf(v2)
	if type1 != type2 {
		return false
	}
	if isSimple(type1.Kind()) {
		return reflect.DeepEqual(v1, v2)
	}
	switch type1.Kind() {
	case reflect.Array, reflect.Slice:
		return compareArrays(v1, v2)
	case reflect.Map:
		return compareMaps(v1, v2)
	}
	panic(fmt.Sprintf("NoOrder: unknown type - %T", v1))
}
func isSimple(kind reflect.Kind) bool {
	switch kind {
	case reflect.Array, reflect.Slice, reflect.Map:
		return false
	}
	return true
}
func compareArrays(v1, v2 interface{}) bool {
	slice1 := reflect.ValueOf(v1)
	slice2 := reflect.ValueOf(v2)
	if slice1.Len() != slice2.Len() {
		return false
	}
	matched := make(map[int]bool)
	for i := 0; i < slice1.Len(); i++ {
		found := false
		item1 := slice1.Index(i).Interface()
		for j := 0; j < slice2.Len(); j++ {
			if matched[j] {
				continue
			}
			item2 := slice2.Index(j).Interface()
			if NoOrder(item1, item2) {
				matched[j] = true
				found = true
				break
			}
		}
		if !found {
			return false
		}
	}
	return true
}