| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- package utils
- import (
- "encoding/binary"
- "errors"
- "f1-game/internal/types"
- "math/rand"
- "os"
- "strings"
- "unicode/utf8"
- cherryFile "github.com/cherry-game/cherry/extend/file"
- cstring "github.com/cherry-game/cherry/extend/string"
- )
- func GetI32MapRandKey(maps map[int32]int32) (int32, int32, bool) {
- var sortKeys []int32
- for k := range maps {
- sortKeys = append(sortKeys, k)
- }
- randIndex := int32(rand.Intn(len(maps) - 1))
- randKey := sortKeys[randIndex]
- val, found := maps[randKey]
- if found {
- return randKey, val, true
- }
- return 0, 0, false
- }
- func ListDir(dirPath string, suffix string) (files []string, err error) {
- files = make([]string, 0, 10)
- judgePath, found := cherryFile.JudgePath(dirPath)
- if !found {
- return nil, errors.New("path error")
- }
- dir, err := os.ReadDir(judgePath)
- if err != nil {
- return nil, err
- }
- suffix = strings.ToLower(suffix)
- for _, fi := range dir {
- if fi.IsDir() {
- continue
- }
- if strings.HasSuffix(strings.ToLower(fi.Name()), suffix) {
- files = append(files, fi.Name())
- }
- }
- return files, nil
- }
- // CutLength 截取指定长度的字符串
- func CutLength(str string, length int) string {
- // var i, n int
- // for i = range str {
- // if length == n {
- // break
- // }
- // n++
- // }
- // return str[:i]
- if utf8.RuneCountInString(str) <= length {
- return str
- }
- return string([]rune(str)[:length])
- }
- func SubStr(str string, start int, length int) (result string) {
- s := []rune(str)
- total := len(s)
- if total == 0 {
- return
- }
- // 允许从尾部开始计算
- if start < 0 {
- start = total + start
- if start < 0 {
- return
- }
- }
- if start > total {
- return
- }
- // 到末尾
- if length < 0 {
- length = total
- }
- end := start + length
- if end > total {
- result = string(s[start:])
- } else {
- result = string(s[start:end])
- }
- return
- }
- // 检查字符长度是否有效
- func CheckStrLen(str string, lenLimit int32) bool {
- strLen := int32(utf8.RuneCountInString(str))
- //判断字符长度是否有效
- if strLen < 1 {
- return false
- }
- //判断字符长度是否超出限制
- if strLen > lenLimit {
- return false
- }
- return true
- }
- func GetPointID(x, y int32) int64 {
- return int64(x)<<32 | int64(y)
- }
- // 计算两个矩形区域的交叉区域
- func GetCrossArea(area1Min, area1Max, area2Min, area2Max types.Point) (leftTop, rightBottom types.Point, ok bool) {
- // 计算投影
- leftTop.X = max(area1Min.X, area2Min.X)
- leftTop.Y = max(area1Min.Y, area2Min.Y)
- rightBottom.X = min(area1Max.X, area2Max.X)
- rightBottom.Y = min(area1Max.Y, area2Max.Y)
- // 判断是否有交集
- ok = leftTop.X < rightBottom.X && leftTop.Y < rightBottom.Y
- return
- }
- func Int64ToBytesFixed(n int64, byteOrder binary.ByteOrder) []byte {
- buf := make([]byte, 8) // int64占8字节
- byteOrder.PutUint64(buf, uint64(n))
- return buf
- }
- // ToStringSlice 将任意类型转换为字符串切片
- func ToStringSlice(val ...any) []string {
- var result []string
- for _, item := range val {
- v := cstring.ToString(item)
- result = append(result, v)
- }
- return result
- }
|