package utils import ( "fmt" "math/rand" "runtime/debug" "strings" "time" "videoweb/pub/common/log" "golang.org/x/exp/constraints" ) func RecoverError(onError func(err error)) { if r := recover(); r != nil { err := fmt.Errorf("internal error: %v", r) if onError != nil { onError(err) } log.Error(fmt.Sprintf("[Panic] RecoverError err: %+v\n", r) + string(debug.Stack())) } } func GetRandom(min, max int) int64 { rand.Seed(time.Now().UnixNano()) return int64(rand.Intn(max-min+1) + min) } func EnsureRange[T constraints.Ordered](value, min, max T) T { if value < min { value = min } if value > max { value = max } return value } func InRange[T constraints.Ordered](value, min, max T) bool { if value < min { return false } if value > max { return false } return true } // Shuffle 使用 Fisher-Yates 算法对切片进行随机排序 func Shuffle[T any](slice []T) { rand.Seed(time.Now().UnixNano()) n := len(slice) for i := n - 1; i > 0; i-- { j := rand.Intn(i + 1) slice[i], slice[j] = slice[j], slice[i] } } func GetRandomMacAddress() string { buf := make([]byte, 6) rand.Read(buf) buf[0] |= 2 mac := fmt.Sprintf("%02x:%02x:%02x:%02x:%02x:%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]) return strings.ToUpper(mac) }