Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
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)
|
|
}
|