| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- package main
- import (
- "bytes"
- "fmt"
- "regexp"
- "strings"
- jsoniter "github.com/json-iterator/go"
- )
- type User struct {
- Name string `json:"name"`
- Age int `json:"age"`
- Email string `json:"email"`
- }
- func main() {
- // user := User{
- // Name: "John Doe",
- // Age: 30,
- // Email: "john@example.com",
- // }
- // // 调用函数
- // params := StructToMap(user)
- // // 打印结果
- // fmt.Println(params["age"])
- fmt.Println(IsValidIDCard("452224200009060026"))
- }
- // IsValidIDCard 检查身份证号是否合法
- func IsValidIDCard(idCard string) bool {
- if len(idCard) != 18 {
- return false
- }
- // 前 17 位必须为数字
- for i := 0; i < 17; i++ {
- if idCard[i] < '0' || idCard[i] > '9' {
- return false
- }
- }
- // 最后一位可以是数字或 'X' 或 'x'
- lastChar := idCard[17]
- if (lastChar < '0' || lastChar > '9') && lastChar != 'X' && lastChar != 'x' {
- return false
- }
- // 加权因子
- weight := []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
- // 校验码对应值
- checkCodes := []rune{'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}
- // 计算校验和
- sum := 0
- for i := 0; i < 17; i++ {
- sum += int(idCard[i]-'0') * weight[i]
- }
- // 计算校验码索引
- index := sum % 11
- // 比较校验码
- expectedCheckCode := checkCodes[index]
- if lastChar != byte(expectedCheckCode) && lastChar != byte(expectedCheckCode+32) {
- return false
- }
- return true
- }
- // UnderlineToCamel 下划线命名转驼峰命名
- func UnderlineToCamel(str string) string {
- re := regexp.MustCompile(`_(\w)`)
- return re.ReplaceAllStringFunc(str, func(s string) string {
- return strings.ToUpper(string(s[1]))
- })
- }
- // CamelToUnderline 驼峰命名转下划线命名
- func CamelToUnderline(str string) string {
- re := regexp.MustCompile(`([A-Z])`)
- return strings.ToLower(re.ReplaceAllString(str, "_$1"))[1:]
- }
- func StructToMap(params any) map[string]any {
- mapParams := map[string]interface{}{}
- jsonParams, err := jsoniter.Marshal(params)
- if err != nil {
- return mapParams
- }
- if err := jsoniter.Unmarshal(jsonParams, &mapParams); err != nil {
- return mapParams
- }
- return mapParams
- }
- func StrUppercase(str string) string {
- str = strings.Title(str)
- re := regexp.MustCompile(`_(\w)`)
- result := re.ReplaceAllStringFunc(str, func(s string) string {
- return "_" + strings.ToUpper(string(s[1]))
- })
- result = strings.ReplaceAll(result, "_", "")
- return result
- }
- func CamelCase(s string) string {
- if s == "" {
- return ""
- }
- t := make([]byte, 0, 32)
- i := 0
- if s[0] == '_' {
- t = append(t, 'X')
- i++
- }
- for ; i < len(s); i++ {
- c := s[i]
- if c == '_' && i+1 < len(s) && isASCIIUpper(s[i+1]) {
- continue
- }
- if isASCIIDigit(c) {
- t = append(t, c)
- continue
- }
- if isASCIIUpper(c) {
- c ^= ' '
- }
- t = append(t, c)
- for i+1 < len(s) && isASCIIUpper(s[i+1]) {
- i++
- t = append(t, '_')
- t = append(t, bytes.ToLower([]byte{s[i]})[0])
- }
- }
- return string(t)
- }
- // 是否是大写字母
- func isASCIIUpper(c byte) bool {
- return 'A' <= c && c <= 'Z'
- }
- // 是否是数字
- func isASCIIDigit(c byte) bool {
- return '0' <= c && c <= '9'
- }
|