跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Go / GolangPay算法

Go 语言信用卡号码 Luhn 算法校验实现

介绍 Go 语言实现信用卡号码校验的方法,基于 Luhn 算法进行合法性验证。内容涵盖项目背景、需求分析、技术原理及完整代码,包括结构体设计、Luhn 算法逻辑、卡前缀匹配等功能。通过去除空格、判空、长度限制及校验位计算,确保数据准确性。方案适用于支付网关、电商平台等场景,支持 Visa、MasterCard 等卡类型识别。

片刻发布于 2026/3/30更新于 2026/5/2327 浏览

项目背景

在现代支付系统中,信用卡(Credit Card)仍然是全球最重要的支付工具之一。无论是电商平台、SaaS 订阅系统、线下 POS 终端,还是移动支付网关,在接收信用卡号时都必须进行基础合法性校验。

如果不进行验证,可能会导致:

  • 无效数据进入数据库
  • 支付接口频繁失败
  • 欺诈风险上升
  • 系统性能浪费
  • 客户体验下降

信用卡号校验主要分为两类:

  1. 格式校验(长度、前缀、数字)
  2. Luhn 算法校验(校验位验证)

其中,Luhn 算法(也称为模 10 算法)是全球通用的银行卡校验标准。

项目需求

基础需求

实现函数:

func IsValidCreditCard(number string) bool

判断字符串是否为合法信用卡号码。

合法信用卡必须满足

  1. 非空
  2. 仅包含数字(可自动去除空格)
  3. 长度在 13–19 位之间
  4. 通过 Luhn 校验算法
  5. 可选:支持常见卡类型识别

合法示例(测试号)

4111111111111111 // Visa
5500000000000004 // MasterCard
340000000000009 // American Express

非法示例

1234567890123456
4111111111111112
abcd123456

相关技术

信用卡结构

典型结构:

[发卡机构标识] + [账户号] + [校验位]

长度:

  • 13–19 位
  • 最后一位是 Luhn 校验位

Luhn 算法原理

步骤:

  1. 从右向左遍历数字
  2. 每隔一位乘以 2
  3. 若乘积大于 9,则减 9
  4. 所有数字求和
  5. 总和 % 10 == 0 则合法

示例:

卡号:4111111111111111

计算后总和 % 10 == 0 → 合法

常见卡类型前缀

类型前缀
Visa4
MasterCard51–55
AmEx34, 37
Discover6011

设计原则

  • 单一职责
  • 可扩展
  • 可识别卡类型
  • 错误信息清晰
  • 支持空格自动处理

实现思路

整体流程:

  1. 去除空格
  2. 判空
  3. 判断是否全为数字
  4. 判断长度范围
  5. 执行 Luhn 算法
  6. 可选:识别卡类型
  7. 返回结果

设计结构体

type CreditCardValidator struct {
	MinLength int
	MaxLength int
}

Luhn 算法实现关键点

  • 使用字符串转数字
  • 从右往左遍历
  • 控制倍增标志

可扩展设计

  • 支持卡类型识别
  • 支持黑名单前缀
  • 支持日志记录

完整实现代码

// =============================
// file: validator/creditcard_validator.go
// =============================
package validator

import (
	"errors"
	"strconv"
	"strings"
	"unicode"
)

// CreditCardValidator 信用卡校验结构体
type CreditCardValidator struct {
	MinLength int
	MaxLength int
}

// NewCreditCardValidator 构造函数
func NewCreditCardValidator() *CreditCardValidator {
	return &CreditCardValidator{
		MinLength: 13,
		MaxLength: 19,
	}
}

// IsValid 校验信用卡是否合法
func (v *CreditCardValidator) IsValid(number string) (bool, error) {
	// 1. 去除空格
	number = strings.ReplaceAll(number, " ", "")
	// 2. 判空
	if number == "" {
		return false, errors.New("信用卡号不能为空")
	}
	// 3. 判断是否全为数字
	for _, r := range number {
		if !unicode.IsDigit(r) {
			return false, errors.New("信用卡号必须为数字")
		}
	}
	// 4. 长度校验
	if len(number) < v.MinLength || len(number) > v.MaxLength {
		return false, errors.New("信用卡号长度不合法")
	}
	// 5. Luhn 算法校验
	if !luhnCheck(number) {
		return false, errors.New("未通过 Luhn 校验")
	}
	return true, nil
}

// luhnCheck Luhn 算法实现
func luhnCheck(number string) bool {
	sum := 0
	double := false
	// 从右往左遍历
	for i := len(number) - 1; i >= 0; i-- {
		digit, _ := strconv.Atoi(string(number[i]))
		if double {
			digit *= 2
			if digit > 9 {
				digit -= 9
			}
		}
		sum += digit
		double = !double
	}
	return sum%10 == 0
}

// GetCardType 识别卡类型
func GetCardType(number string) string {
	number = strings.ReplaceAll(number, " ", "")
	if strings.HasPrefix(number, "4") {
		return "Visa"
	}
	if len(number) >= 2 {
		prefix2 := number[:2]
		if prefix2 == "34" || prefix2 == "37" {
			return "American Express"
		}
	}
	if len(number) >= 2 {
		prefix2 := number[:2]
		if prefix2 >= "51" && prefix2 <= "55" {
			return "MasterCard"
		}
	}
	if strings.HasPrefix(number, "6011") {
		return "Discover"
	}
	return "Unknown"
}
// =============================
// file: main.go
// =============================
package main

import (
	"fmt"
	"creditcard/validator"
)

func main() {
	v := validator.NewCreditCardValidator()
	testCases := []string{
		"4111111111111111",
		"5500000000000004",
		"340000000000009",
		"1234567890123456",
		"4111111111111112",
	}
	for _, t := range testCases {
		valid, err := v.IsValid(t)
		fmt.Println("卡号:", t)
		fmt.Println("是否有效:", valid)
		fmt.Println("错误:", err)
		fmt.Println("卡类型:", validator.GetCardType(t))
		fmt.Println("---------------------")
	}
}

代码解读

NewCreditCardValidator

初始化校验器,设置长度范围 13–19。

IsValid

主校验函数:

  • 去空格
  • 判空
  • 判断是否数字
  • 长度限制
  • Luhn 算法验证

luhnCheck

实现模 10 算法:

  • 从右往左
  • 每隔一位乘 2
  • 超过 9 减 9
  • 求和后模 10 判断

GetCardType

根据前缀识别卡类型。

项目总结

本项目实现了:

✔ 严格数字校验 ✔ Luhn 算法实现 ✔ 卡类型识别 ✔ 可扩展设计 ✔ 企业级基础校验逻辑

适用于:

  • 支付网关
  • 电商平台
  • 金融系统
  • 表单前端后端双重校验

常见问题

Q1:通过 Luhn 就一定是有效卡吗?

不是,只是格式合法。

Q2:是否可以验证真实卡存在?

需要调用银行 API 或支付网关。

Q3:是否支持借记卡?

支持,只要符合 Luhn。

扩展与优化

1️⃣ 支持更多卡组织

可扩展前缀判断规则,例如:

  • Visa
  • MasterCard
  • American Express
  • Discover

2️⃣ 支持 BIN 数据库校验

引入 BIN 数据库做更精确识别。

3️⃣ 并发批量校验优化

当前算法时间复杂度 O(n),非常轻量。

4️⃣ 添加单元测试

使用:

go test

结语

本教程完整实现了 Go 语言验证信用卡号码(Luhn 算法)算法。

目录

  1. 项目背景
  2. 项目需求
  3. 基础需求
  4. 合法信用卡必须满足
  5. 合法示例(测试号)
  6. 非法示例
  7. 相关技术
  8. 信用卡结构
  9. Luhn 算法原理
  10. 常见卡类型前缀
  11. 设计原则
  12. 实现思路
  13. 设计结构体
  14. Luhn 算法实现关键点
  15. 可扩展设计
  16. 完整实现代码
  17. 代码解读
  18. NewCreditCardValidator
  19. IsValid
  20. luhnCheck
  21. GetCardType
  22. 项目总结
  23. 常见问题
  24. Q1:通过 Luhn 就一定是有效卡吗?
  25. Q2:是否可以验证真实卡存在?
  26. Q3:是否支持借记卡?
  27. 扩展与优化
  28. 1️⃣ 支持更多卡组织
  29. 2️⃣ 支持 BIN 数据库校验
  30. 3️⃣ 并发批量校验优化
  31. 4️⃣ 添加单元测试
  32. 结语
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Neo4j Python SDK 使用手册
  • 修复 Microsoft Visual C++ 2022 X86 Minimum Runtime 安装错误
  • Python Web 开发与爬虫方向如何选择
  • 城市热岛效应研究:GLM-4.6V-Flash-WEB 分析红外遥感数据
  • 基于 STM32 的智能家居环境监测系统设计
  • Windows 10/11 部署 OpenClaw 机器人控制框架指南
  • 循环神经网络(RNN)与序列数据处理实战
  • Mac 端 Git 基础概念与 PyCharm 使用指南
  • 红黑树封装 map 和 set 的实现原理与代码
  • 华为 OD 机试双机位 C 卷 - 评委评分算法题解
  • 华为 OD 机试动态规划与双指针算法实战
  • FPGA 实现 NVMe 硬盘读写功能详解
  • 北理工 Fira:低秩约束下实现 LLM 全秩训练的新探索
  • Python+Django 城市化自习室管理系统设计与实现
  • 知网 AIGC 检测不通过的处理思路与步骤
  • 基于 SpringBoot 的古典舞在线交流平台设计与实现
  • Python import 导入机制详解
  • 汇川机器人软件 RobotLab 常规操作指南
  • Flutter 实现小程序混合 App 的开发实践
  • AI 编程工具 Cursor 核心功能与技术架构解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online