2026/4/18 11:53:41
网站建设
项目流程
怎么做自己的外卖网站,公司注册邮箱怎么注册,买个人家的网站绑定自己的域名,怎么选择赣州网站建设在Go语言中实现手机号脱敏显示主要有以下几种方式#xff0c;从简单到完整逐步推荐#xff1a;
一、基础实现#xff08;字符串切片#xff09;
最常用且高效的方式是直接使用字符串切片操作#xff0c;保留前3位和后4位#xff0c;中间用*替换#xff1a;
go
复制 …在Go语言中实现手机号脱敏显示主要有以下几种方式从简单到完整逐步推荐一、基础实现字符串切片最常用且高效的方式是直接使用字符串切片操作保留前3位和后4位中间用*替换go复制package main import fmt // DesensitizePhone 手机号脱敏基础版 func DesensitizePhone(phone string) string { // 检查长度是否为11位 if len(phone) ! 11 { return phone } // 13812345678 - 138****5678 return phone[:3] **** phone[7:] } func main() { phone : 13812345678 fmt.Println(原始:, phone) // 原始: 13812345678 fmt.Println(脱敏后:, DesensitizePhone(phone)) // 脱敏后: 138****5678 }二、增强实现正则验证增加手机号格式验证确保只有合法手机号才被脱敏go复制package main import ( fmt regexp ) // DesensitizePhoneRegex 手机号脱敏带正则验证 func DesensitizePhoneRegex(phone string) string { // 验证手机号格式1开头第二位3-9总长度11位 if matched, _ : regexp.MatchString(^1[3-9]\d{9}$, phone); matched { return phone[:3] **** phone[7:] } return phone // 格式不匹配则原样返回 } func main() { fmt.Println(DesensitizePhoneRegex(13812345678)) // 138****5678 fmt.Println(DesensitizePhoneRegex(12345678901)) // 12345678901 (不处理) }三、使用第三方脱敏库如果需要统一处理多种敏感信息身份证、邮箱、姓名等推荐使用desensitization库bash复制go get github.com/wu-songg/desensitization-spring-boot-startergo复制import ( fmt pf_util // 脱敏工具包 ) func main() { d : pf_util.DesensitizedUtil{} // 4 表示 MobilePhone 类型 result : d.SetType(4).Desensitized(13812345678) fmt.Println(result) // 138****5678 // 自定义脱敏规则类型, 内容, 脱敏长度, 位置 custom : d.Method(mobile, 13812345678, 4, 3) // 从第3位开始脱敏4位 fmt.Println(custom) // 138****5678 }四、完整生产环境方案结合正则匹配和灵活处理支持多种场景go复制package main import ( fmt regexp unicode/utf8 ) // HidePhone 通用脱敏函数 func HidePhone(str string) string { if str { return *** } // 手机号正则 reg : ^1[3-9]\d{9}$ rgx : regexp.MustCompile(reg) if rgx.MatchString(str) { // 手机号13812345678 - 138****5678 return str[:3] **** str[7:] } // 处理其他类型如座机、国际号码等 // 可根据需求扩展 return str } // SafeSubstring 安全截取字符串支持中文 func SafeSubstring(s string, start, end int) string { runes : []rune(s) if start len(runes) || end len(runes) || start end { return s } return string(runes[start:end]) } func main() { // 测试用例 testCases : []string{ 13812345678, // 标准手机号 12345678901, // 非法手机号 8613812345678, // 带区号 } for _, phone : range testCases { fmt.Printf(原始: %s - 脱敏: %s\n, phone, HidePhone(phone)) } }五、性能建议优先使用字符串操作直接切片比正则性能高10倍以上适用于简单场景预编译正则如果需要验证将regexp.MustCompile放在全局变量避免重复编译并发安全以上方法都是无状态的可在并发环境直接使用六、单元测试go复制func TestDesensitizePhone(t *testing.T) { tests : []struct { input string expected string }{ {13812345678, 138****5678}, {12345678901, 12345678901}, // 非法手机号不处理 {1381234567, 1381234567}, // 长度不足不处理 {, ***}, } for _, tt : range tests { result : HidePhone(tt.input) if result ! tt.expected { t.Errorf(输入 %s期望 %s实际 %s, tt.input, tt.expected, result) } } }总结简单场景直接用字符串切片方案需要验证格式用正则增强方案企业级项目建议用第三方库统一处理多种敏感信息