// Package utils 身份证处理 package utils import ( "errors" "regexp" "strconv" "strings" "time" "unicode/utf8" ) // GetCardAge 获取身份证年龄 func GetCardAge(cardNum string) (int, error) { // 获取当前时间 now := time.Now() // 解析身份证号中的出生日期 birthDateStr := cardNum[6:14] birthYear, err := strconv.Atoi(birthDateStr[0:4]) if err != nil { return 0, err } birthMonth, err := strconv.Atoi(birthDateStr[4:6]) if err != nil { return 0, err } // 计算年龄 age := now.Year() - birthYear if now.Month() < time.Month(birthMonth) { age-- } return age, nil } // CheckCardNum 检测身份证号 func CheckCardNum(cardNum string) (bool, error) { regex := `^(?:1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5])\d{4}(?:1[89]|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dxX]$` match, err := regexp.MatchString(regex, cardNum) if !match || err != nil { return false, errors.New("身份证号错误") } return true, nil } // GetCardSex 获取身份证性别 func GetCardSex(cardNum string) (int, error) { genderStr := cardNum[len(cardNum)-2 : len(cardNum)-1] genderNum, err := strconv.Atoi(genderStr) if err != nil { return 0, err } // 判断性别 if genderNum%2 == 0 { return 2, nil } else { return 1, nil } } // GetMaskCardNum 身份证号码脱敏 func GetMaskCardNum(cardNum string) string { if len(cardNum) != 18 { return cardNum } // 获取身份证号前后部分 frontPart := cardNum[0:6] backPart := cardNum[14:] // 替换中间部分数字为 * middlePart := "****" // 拼接新的身份证号 maskedIDCard := frontPart + middlePart + backPart return maskedIDCard } // GetMaskCardName 身份证名字脱敏 func GetMaskCardName(cardName string) string { // 判断姓名长度 length := utf8.RuneCountInString(cardName) // 判断是否是英文姓名 isEnglish := strings.ContainsAny(cardName, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") if length == 2 { // 两个字符的姓名 if isEnglish { // 英文姓名 return string(cardName[0]) + "*" } else { // 中文姓名 return string([]rune(cardName)[0]) + "*" } } else if length == 3 { // 三个字符的姓名 if isEnglish { // 英文姓名 return string(cardName[0]) + "*" + string(cardName[2]) } else { // 中文姓名 return string([]rune(cardName)[0]) + "*" + string([]rune(cardName)[2]) } } else if length >= 4 { // 四个及以上字符的姓名 if isEnglish { // 英文姓名 return string(cardName[0]) + "*" + string(cardName[length-1]) } else { // 中文姓名 return string([]rune(cardName)[0]) + "*" + string([]rune(cardName)[length-1]) } } return cardName }