utils.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package utils
  2. import (
  3. "encoding/binary"
  4. "errors"
  5. "f1-game/internal/types"
  6. "math/rand"
  7. "os"
  8. "strings"
  9. "unicode/utf8"
  10. cherryFile "github.com/cherry-game/cherry/extend/file"
  11. cstring "github.com/cherry-game/cherry/extend/string"
  12. )
  13. func GetI32MapRandKey(maps map[int32]int32) (int32, int32, bool) {
  14. var sortKeys []int32
  15. for k := range maps {
  16. sortKeys = append(sortKeys, k)
  17. }
  18. randIndex := int32(rand.Intn(len(maps) - 1))
  19. randKey := sortKeys[randIndex]
  20. val, found := maps[randKey]
  21. if found {
  22. return randKey, val, true
  23. }
  24. return 0, 0, false
  25. }
  26. func ListDir(dirPath string, suffix string) (files []string, err error) {
  27. files = make([]string, 0, 10)
  28. judgePath, found := cherryFile.JudgePath(dirPath)
  29. if !found {
  30. return nil, errors.New("path error")
  31. }
  32. dir, err := os.ReadDir(judgePath)
  33. if err != nil {
  34. return nil, err
  35. }
  36. suffix = strings.ToLower(suffix)
  37. for _, fi := range dir {
  38. if fi.IsDir() {
  39. continue
  40. }
  41. if strings.HasSuffix(strings.ToLower(fi.Name()), suffix) {
  42. files = append(files, fi.Name())
  43. }
  44. }
  45. return files, nil
  46. }
  47. // CutLength 截取指定长度的字符串
  48. func CutLength(str string, length int) string {
  49. // var i, n int
  50. // for i = range str {
  51. // if length == n {
  52. // break
  53. // }
  54. // n++
  55. // }
  56. // return str[:i]
  57. if utf8.RuneCountInString(str) <= length {
  58. return str
  59. }
  60. return string([]rune(str)[:length])
  61. }
  62. func SubStr(str string, start int, length int) (result string) {
  63. s := []rune(str)
  64. total := len(s)
  65. if total == 0 {
  66. return
  67. }
  68. // 允许从尾部开始计算
  69. if start < 0 {
  70. start = total + start
  71. if start < 0 {
  72. return
  73. }
  74. }
  75. if start > total {
  76. return
  77. }
  78. // 到末尾
  79. if length < 0 {
  80. length = total
  81. }
  82. end := start + length
  83. if end > total {
  84. result = string(s[start:])
  85. } else {
  86. result = string(s[start:end])
  87. }
  88. return
  89. }
  90. // 检查字符长度是否有效
  91. func CheckStrLen(str string, lenLimit int32) bool {
  92. strLen := int32(utf8.RuneCountInString(str))
  93. //判断字符长度是否有效
  94. if strLen < 1 {
  95. return false
  96. }
  97. //判断字符长度是否超出限制
  98. if strLen > lenLimit {
  99. return false
  100. }
  101. return true
  102. }
  103. func GetPointID(x, y int32) int64 {
  104. return int64(x)<<32 | int64(y)
  105. }
  106. // 计算两个矩形区域的交叉区域
  107. func GetCrossArea(area1Min, area1Max, area2Min, area2Max types.Point) (leftTop, rightBottom types.Point, ok bool) {
  108. // 计算投影
  109. leftTop.X = max(area1Min.X, area2Min.X)
  110. leftTop.Y = max(area1Min.Y, area2Min.Y)
  111. rightBottom.X = min(area1Max.X, area2Max.X)
  112. rightBottom.Y = min(area1Max.Y, area2Max.Y)
  113. // 判断是否有交集
  114. ok = leftTop.X < rightBottom.X && leftTop.Y < rightBottom.Y
  115. return
  116. }
  117. func Int64ToBytesFixed(n int64, byteOrder binary.ByteOrder) []byte {
  118. buf := make([]byte, 8) // int64占8字节
  119. byteOrder.PutUint64(buf, uint64(n))
  120. return buf
  121. }
  122. // ToStringSlice 将任意类型转换为字符串切片
  123. func ToStringSlice(val ...any) []string {
  124. var result []string
  125. for _, item := range val {
  126. v := cstring.ToString(item)
  127. result = append(result, v)
  128. }
  129. return result
  130. }