当前位置: 首页 > news >正文

Golang实现简单的接口去重函数

背景

在某次项目中,我们需要采集所有路径(path),但发现部分接口的参数嵌入在路径中。会导致大量重复采集。为此,提出了一种简单有效的去重代码(较为粗糙)。

代码

package main

import (
	"fmt"
	"regexp"
	"strings"
)

// replaceNumbersWithID 替换路径中的数字、字母加数字组合以及连续的中文字符编码
func replaceNumbersWithID(input string) string {

	// 4. 替换 UUID 格式的字符串
	reUUID := regexp.MustCompile(`[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}`)
	result := reUUID.ReplaceAllString(input, "{:id}")

	// 1. 替换连续的中文字符编码(%开头,后面跟着两个十六进制字符,连续出现)
	reChinese := regexp.MustCompile(`(?:%[0-9A-Fa-f]{2})+`)
	result = reChinese.ReplaceAllString(result, "{:id}")

	// 2. 替换独立的数字
	reDigits := regexp.MustCompile(`\b[0-9]+\b`)
	result = reDigits.ReplaceAllStringFunc(result, func(match string) string {
		// 检查数字前后是否有字母(避免替换类似`abc123`中的`123`)
		if strings.IndexFunc(match, func(r rune) bool { return r >= 'a' && r <= 'z' || r >= 'A' && r <= 'Z' }) != -1 {
			return match // 不进行替换
		}
		return "{:id}"
	})

	// 3. 替换字母加数字组合超过12位的字符串
	reLong := regexp.MustCompile(`\b[a-zA-Z0-9]{13,}\b`)
	result = reLong.ReplaceAllString(result, "{:id}")

	return result
}

func main() {
	// 示例路径
	paths := []string{
		"/api/user/123",
		"/api/product/456/details",
		"/api/order/789",
		"/api/user/profile",
		"/api/data/%E6%88%91%E6%98%AF%E4%B8%80%E4%B8%AA%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE", // 包含连续的中文字符编码
		"/api/data/abcdefghij1234567890", // 超过12位的字母加数字组合
		"/api/12345678-59a1-1234-97b5-48f6d9a37c5d",
	}

	// 替换路径中的编码
	for _, path := range paths {
		newPath := replaceNumbersWithID(path)
		fmt.Printf("Original: %s -> Replaced: %s\n", path, newPath)
	}
}

运行结果

Original: /api/user/123 -> Replaced: /api/user/{:id}
Original: /api/product/456/details -> Replaced: /api/product/{:id}/details
Original: /api/order/789 -> Replaced: /api/order/{:id}
Original: /api/user/profile -> Replaced: /api/user/profile
Original: /api/data/%E6%88%91%E6%98%AF%E4%B8%80%E4%B8%AA%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE -> Replaced: /api/data/{:id}
Original: /api/data/abcdefghij1234567890 -> Replaced: /api/data/{:id}
Original: /api/12345678-59a1-1234-97b5-48f6d9a37c5d -> Replaced: /api/{:id}

文章转载自:

http://75BBKl0v.pcbfL.cn
http://tCI524Cu.pcbfL.cn
http://HYriqj2c.pcbfL.cn
http://QZ8CUKpC.pcbfL.cn
http://S5f7QdaJ.pcbfL.cn
http://nmkS2Hy7.pcbfL.cn
http://NgFO39lw.pcbfL.cn
http://ri5eZthK.pcbfL.cn
http://V1ZZjVIo.pcbfL.cn
http://jaraW0Hd.pcbfL.cn
http://oAR4mppW.pcbfL.cn
http://WgBYUtef.pcbfL.cn
http://0VZP2RE3.pcbfL.cn
http://AK7O9in4.pcbfL.cn
http://XfvEEpEF.pcbfL.cn
http://25oD0pAR.pcbfL.cn
http://LYrzu8bU.pcbfL.cn
http://m6xTWFvs.pcbfL.cn
http://e4yUrUd4.pcbfL.cn
http://SneLjTWG.pcbfL.cn
http://4pV9z1YS.pcbfL.cn
http://HRRSdwgK.pcbfL.cn
http://5zCOyXPb.pcbfL.cn
http://K8IVjFoI.pcbfL.cn
http://mMHRvkgu.pcbfL.cn
http://s3iAF5E0.pcbfL.cn
http://4eCRMrDk.pcbfL.cn
http://dMYQHRJq.pcbfL.cn
http://ieXiyYCB.pcbfL.cn
http://zwKttBcm.pcbfL.cn
http://www.dtcms.com/a/29244.html

相关文章:

  • Http升级为Https - 开发/测试服环境
  • MATLAB基础学习相关知识
  • 【Java】多线程和高并发编程(四):阻塞队列(上)基础概念、ArrayBlockingQueue
  • 深入理解IP地址与端口:网络通信的基石
  • 现代游戏UI架构深度解析——以UIController为核心的模块化界面管理系统
  • 华大MCU HC32F005端口GPIO控制失效问题
  • 在原有基础上的Python正则表达式终极指南,新增高级用法、复杂案例和底层原理分析
  • DApp 开发入门指南
  • 车载诊断数据库 --- 通用性诊断数据库ODX
  • ubuntu22.04桥接模式开代理
  • 改BUG:Mock测试的时候,when失效
  • 面试题之箭头函数和普通函数有什么区别?
  • 【AI】GitHub Copilot
  • 从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革
  • VScode 使用Deepseek又方便又好用的另一款插件
  • 掌握.NET Core后端发布流程,如何部署后端应用?
  • 【LeetCode】力扣刷题攻略路线推荐!适合新手小白入门~(含各类题目序号)
  • 2025年2月深度实测!DeepSeek、OpenAI o1、Gemini打造爆款应用及对比
  • 【Java场景题】MySQL死锁排查
  • 解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported
  • 跟着李沐老师学习深度学习(十三)
  • 基于Linux平台的多实例RTSP|RTMP直播播放器深度解析与技术实现
  • 什么是3D可视化?有哪些优势和应用领域?
  • Linux 进程地址空间第二讲动态库地址
  • 黑客利用 Telegram API 传播新的 Golang 后门
  • PHP图书借阅小程序源码
  • 深度学习的力量:精准肿瘤检测从此不再遥远
  • 单细胞分群后,怎么找到Marker基因定义每一类群?
  • 基于ffmpeg+openGL ES实现的视频编辑工具-opengl相关逻辑(五)
  • C语言文件操作学习笔记