helpers.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Package helpers 存放辅助方法
  2. package helpers
  3. import (
  4. "crypto/rand"
  5. "fmt"
  6. "io"
  7. mathrand "math/rand/v2"
  8. "reflect"
  9. "time"
  10. )
  11. type helper struct{}
  12. func (h helper) Uint64() uint64 {
  13. return uint64(time.Now().UnixNano())
  14. }
  15. // Empty 类似于 PHP 的 empty() 函数
  16. func Empty(val any) bool {
  17. if val == nil {
  18. return true
  19. }
  20. v := reflect.ValueOf(val)
  21. switch v.Kind() {
  22. case reflect.String, reflect.Array:
  23. return v.Len() == 0
  24. case reflect.Map, reflect.Slice:
  25. return v.Len() == 0 || v.IsNil()
  26. case reflect.Bool:
  27. return !v.Bool()
  28. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  29. return v.Int() == 0
  30. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  31. return v.Uint() == 0
  32. case reflect.Float32, reflect.Float64:
  33. return v.Float() == 0
  34. case reflect.Interface, reflect.Ptr:
  35. return v.IsNil()
  36. }
  37. return reflect.DeepEqual(val, reflect.Zero(v.Type()).Interface())
  38. }
  39. // MicrosecondsStr 将 time.Duration 类型(nano seconds 为单位)
  40. // 输出为小数点后 3 位的 ms (microsecond 毫秒,千分之一秒)
  41. func MicrosecondsStr(elapsed time.Duration) string {
  42. return fmt.Sprintf("%.3fms", float64(elapsed.Nanoseconds())/1e6)
  43. }
  44. // 生成随机数字符串
  45. // length: 字符串长度
  46. func RandomNumber(length int) string {
  47. table := [...]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}
  48. b := make([]byte, length)
  49. n, err := io.ReadAtLeast(rand.Reader, b, length)
  50. if n != length {
  51. panic(err)
  52. }
  53. for i := 0; i < len(b); i++ {
  54. b[i] = table[int(b[i])%len(table)]
  55. }
  56. return string(b)
  57. }
  58. // RandomString 生成长度为 length 的随机字符串
  59. func RandomString(length int) string {
  60. mathrand.New(&helper{})
  61. letters := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  62. b := make([]byte, length)
  63. for i := range b {
  64. b[i] = letters[mathrand.IntN(len(letters))]
  65. }
  66. return string(b)
  67. }
  68. // FirstElement 获取 args[0],避免 panic
  69. func FirstElement(args []string) string {
  70. if len(args) > 0 {
  71. return args[0]
  72. }
  73. return ""
  74. }