temp.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "regexp"
  6. "strings"
  7. jsoniter "github.com/json-iterator/go"
  8. )
  9. type User struct {
  10. Name string `json:"name"`
  11. Age int `json:"age"`
  12. Email string `json:"email"`
  13. }
  14. func main() {
  15. // user := User{
  16. // Name: "John Doe",
  17. // Age: 30,
  18. // Email: "john@example.com",
  19. // }
  20. // // 调用函数
  21. // params := StructToMap(user)
  22. // // 打印结果
  23. // fmt.Println(params["age"])
  24. fmt.Println(IsValidIDCard("452224200009060026"))
  25. }
  26. // IsValidIDCard 检查身份证号是否合法
  27. func IsValidIDCard(idCard string) bool {
  28. if len(idCard) != 18 {
  29. return false
  30. }
  31. // 前 17 位必须为数字
  32. for i := 0; i < 17; i++ {
  33. if idCard[i] < '0' || idCard[i] > '9' {
  34. return false
  35. }
  36. }
  37. // 最后一位可以是数字或 'X' 或 'x'
  38. lastChar := idCard[17]
  39. if (lastChar < '0' || lastChar > '9') && lastChar != 'X' && lastChar != 'x' {
  40. return false
  41. }
  42. // 加权因子
  43. weight := []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
  44. // 校验码对应值
  45. checkCodes := []rune{'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}
  46. // 计算校验和
  47. sum := 0
  48. for i := 0; i < 17; i++ {
  49. sum += int(idCard[i]-'0') * weight[i]
  50. }
  51. // 计算校验码索引
  52. index := sum % 11
  53. // 比较校验码
  54. expectedCheckCode := checkCodes[index]
  55. if lastChar != byte(expectedCheckCode) && lastChar != byte(expectedCheckCode+32) {
  56. return false
  57. }
  58. return true
  59. }
  60. // UnderlineToCamel 下划线命名转驼峰命名
  61. func UnderlineToCamel(str string) string {
  62. re := regexp.MustCompile(`_(\w)`)
  63. return re.ReplaceAllStringFunc(str, func(s string) string {
  64. return strings.ToUpper(string(s[1]))
  65. })
  66. }
  67. // CamelToUnderline 驼峰命名转下划线命名
  68. func CamelToUnderline(str string) string {
  69. re := regexp.MustCompile(`([A-Z])`)
  70. return strings.ToLower(re.ReplaceAllString(str, "_$1"))[1:]
  71. }
  72. func StructToMap(params any) map[string]any {
  73. mapParams := map[string]interface{}{}
  74. jsonParams, err := jsoniter.Marshal(params)
  75. if err != nil {
  76. return mapParams
  77. }
  78. if err := jsoniter.Unmarshal(jsonParams, &mapParams); err != nil {
  79. return mapParams
  80. }
  81. return mapParams
  82. }
  83. func StrUppercase(str string) string {
  84. str = strings.Title(str)
  85. re := regexp.MustCompile(`_(\w)`)
  86. result := re.ReplaceAllStringFunc(str, func(s string) string {
  87. return "_" + strings.ToUpper(string(s[1]))
  88. })
  89. result = strings.ReplaceAll(result, "_", "")
  90. return result
  91. }
  92. func CamelCase(s string) string {
  93. if s == "" {
  94. return ""
  95. }
  96. t := make([]byte, 0, 32)
  97. i := 0
  98. if s[0] == '_' {
  99. t = append(t, 'X')
  100. i++
  101. }
  102. for ; i < len(s); i++ {
  103. c := s[i]
  104. if c == '_' && i+1 < len(s) && isASCIIUpper(s[i+1]) {
  105. continue
  106. }
  107. if isASCIIDigit(c) {
  108. t = append(t, c)
  109. continue
  110. }
  111. if isASCIIUpper(c) {
  112. c ^= ' '
  113. }
  114. t = append(t, c)
  115. for i+1 < len(s) && isASCIIUpper(s[i+1]) {
  116. i++
  117. t = append(t, '_')
  118. t = append(t, bytes.ToLower([]byte{s[i]})[0])
  119. }
  120. }
  121. return string(t)
  122. }
  123. // 是否是大写字母
  124. func isASCIIUpper(c byte) bool {
  125. return 'A' <= c && c <= 'Z'
  126. }
  127. // 是否是数字
  128. func isASCIIDigit(c byte) bool {
  129. return '0' <= c && c <= '9'
  130. }