helpers.go 1.6 KB

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