Golang 实现本地身份证归属地查询

本文介绍了如何使用Golang进行身份证号码验证,并详细讲述了读取本地身份证归属地数据表的过程,提供了完整的代码实现。尽管数据可能不是最新,但适合离线环境下使用。文章结尾提到作者正学习Go语言,未来将分享调用API查询身份证归属地的方法。
摘要由CSDN通过智能技术生成

1)身份证号码验证

因为离线本地查询,不调用api接口,个人认为除了拥有公安机关保密的全国身份证号码数据库,要不然我们难以验证所有身份证号码是否正确。所以我们只能验证身份证格式,有些符合格式但是却又不存在的身份证号码可能也会被识别出来。我们主要从区域码、校验码和生日格式来判断身份证号码的准确性。

  1. 验证区域码
    区域码就是身份证前两位数字,如:44代表广东省,45代表广西壮族自治区…
//验证区域码
func CheckProvinceValid(idcard string) bool {
   
	citizenNo := []byte(idcard)
	provinceCode := make([]byte, 0)
	provinceCode = append(provinceCode, citizenNo[:2]...)
	provinceStr := string(provinceCode)
	for i, _ := range validProvince {
   
		if provinceStr == validProvince[i] {
   
			fmt.Println("区域码验证成功")
			return true
		}
	}
	fmt.Println("区域码验证失败")
	return false
}
  1. 验证校验码
    校验码就是18位身份证最后一位,通过特定的公式计算得到的,这里不做解释了。
//18位身份证校验码
func IsValidCitizenNo18(idcard  string) bool {
   
	//string -> []byte
	citizenNo18 :=[]byte(idcard )
	nSum := 0
	for i := 0; i < len(citizenNo18) - 1; i++ {
   
		n, _ := strconv.Atoi(string(citizenNo18[i]))
		nSum += n * weight[i]
	}
	//mod得出18位身份证校验码
	mod := nSum % 11
	if validValue[mod] == citizenNo18[17] {
   
		fmt.Println("校验码验证成功")
		return true
	}
	fmt.Println("校验码验证失败")
	return false
}
  1. 验证生日格式
//验证生日
func CheckBirthdayValid(nYear, nMonth, nDay int) bool {
   
	if nYear < 1900 || nMonth <= 0 || nMonth > 12 || nDay <= 0 || nDay > 31 {
   
		fmt.Println("生日验证失败")
		return false
	}
	//出生日期大于现在的日期
	curYear, curMonth, curDay := time.Now().Date()
	if nYear == curYear {
   
		if nMonth > int(curMonth) {
   
			fmt.Println("生日验证失败")
			return false
		} else if nMonth == int(curMonth) && nDay > curDay {
   
			fmt.Println("生日验证失败")
			return false
		}
	}
	//出生日期在2月份
	if 2 == nMonth {
   
		//闰年2月只有29号
		if IsLeapYear(nYear) && nDay > 29 {
   
			fmt.Println("生日验证失败")
			return false
		} else if nDay > 28 {
   		//非闰年2月只有28号
			fmt.Println("生日验证失败")
			return false
		}
	} else if 4 == nMonth || 6 == nMonth || 9 == nMonth || 11 == nMonth {
   	//小月只有30号
		if nDay > 30 {
   
			fmt.Println("生日验证失败")
			return false
		}
	}
	fmt.Println("生日验证成功&#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值