strings.Replace 使用详解
目录
1. 官方包
2. 支持版本
3. 官方说明
4. 作用
5. 实现原理
6. 推荐使用场景和不推荐使用场景
推荐场景
不推荐场景
7. 使用场景示例
示例1:官方示例
示例2:模板变量替换
示例3:敏感信息脱敏(隐藏手机号中间四位)
8. 性能及同类对比
性能特点
对比其他方法(替换 1000 次 "a" -> "b")
9. 总结
特性说明
对比总结表
最终建议
1. 官方包
是的,strings.Replace 是 Go 语言标准库 strings 包中的函数,属于官方提供的核心功能
2. 支持版本
strings.Replace 自 Go 1.0 版本就已存在,所有 Go 1.x 版本均支持,兼容性极强
3. 官方说明
func Replace
func Replace(s, old, new string, n int) string
英文说明:
Replace returns a copy of the string s with the first n non-overlapping instances of old replaced by new. If old is empty, it matches at the beginning of the string and after each UTF-8 sequence, yielding up to k+1 replacements for a k-rune string. If n < 0, there is no limit on the number of replacements.
中文翻译:
Replace返回字符串s的副本,其中旧的前n个不重叠的实例替换为new。如果old为空,它匹配字符串的开头和每个UTF-8序列之后,为k-rune字符串产生最多k+1个替换。如果n < 0,则替换次数没有限制。
4. 作用
在字符串 s 中将前 n 个 old 子串替换为 new 子串。若 n < 0 则替换所有匹配项
特点:
- 支持限制替换次数
- 线程安全(返回新字符串)
5. 实现原理
- 快速路径
- 若 old == new 或 n == 0 直接返回原字符串
- 若 old 为空,则在每个字符间插入 new
- 搜索替换
- 使用 strings.Index 查找 old 子串位置
- 预计算新字符串长度并分配内存
- 批量复制非匹配段和替换段
6. 推荐使用场景和不推荐使用场景
推荐场景
- 固定子串替换(如模板变量替换)
- 敏感信息脱敏(如手机号部分隐藏)
- 批量标准化(如统一日期格式)
不推荐场景
- 复杂模式匹配(需用正则表达式)
- 高频超长文本替换(性能可能不足)
- 需要条件判断的替换(需自定义逻辑)
7. 使用场景示例
示例1:官方示例
fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
运行后输出:
oinky oinky oink
moo moo moo
解析:
代码功能
- 第一个 Replace:将前 2 个 "k" 替换为 "ky"
- 第二个 Replace:替换所有 "oink" 为 "moo"
函数原型
func Replace(s, old, new string, n int) string
- s:原始字符串
- old:需要被替换的子串
- new:替换后的子串
- n:替换次数
- n > 0:替换前 n 次
- n = -1:替换所有出现
代码解析
1. 第一个示例
fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
- 操作过程
- 查找所有 "k" (共 3 处)
- 只替换前 2 个 "k" -> "ky"
- oink -> oinky
- oink -> oinky
- 第三个 oink 保持不变
结果:
oinky oinky oink
2. 第二个示例
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
- 操作过程
- n = -1 表示替换所有匹配项
- 将全部 3 个 "oink" 替换为 "moo"
结果:
moo moo moo
示例2:模板变量替换
template := "尊敬的{{name}},您的订单{{order_id}}已发货"
data := map[string]string{"{{name}}": "张三","{{order_id}}": "20250101",
}// 批量替换模板变量
content := template
for old, new := range data {content = strings.Replace(content, old, new, -1)
}
fmt.Println(content)
运行后输出:
尊敬的张三,您的订单20250101已发货
解析:
代码功能
将模板字符串中的 {{name}} 和 {{order_id}} 替换为真实数据,生成最终的通知内容
尊敬的张三,您的订单20250101已发货
代码解析
1. 定义模板和数据集
template := "尊敬的{{name}},您的订单{{order_id}}已发货"
data := map[string]string{"{{name}}": "张三","{{order_id}}": "20250101",
}
- 模板中使用 {{变量名}} 作为占位符
- data 是键值对映射,定义占位符与实际值的对应关系
2. 批量替换逻辑
content := template
for old, new := range data {content = strings.Replace(content, old, new, -1)
}
- strings.Replace 参数
- content:当前处理的字符串
- old:待替换的占位符(如 {{name}})
- new:替换值(如 "张三")
- -1:替换所有匹配项
- 遍历过程
- 第一次循环:将 {{name}} 替换为 "张三"
- 第二次循环:将 {{order_id}} 替换为 "20250101"
3. 最终输出
fmt.Println(content)
// 输出:尊敬的张三,您的订单20250101已发货
适用场景:
- 邮件/短信模板批量渲染
- 优势:比 text/template 更轻量
- 注意:变量名需唯一且不含冲突符号
示例3:敏感信息脱敏(隐藏手机号中间四位)
phone := "13812345678"
masked := strings.Replace(phone, phone[3:7], "****", 1)
fmt.Println(masked)
运行后输出:
138****5678
解析:
代码功能
将手机号 "13812345678" 的第4-7位(索引3到6)替换为 ****,输出脱敏后的结果:
138****5678
代码解析
1. 原始手机号
phone := "13812345678" // 长度11位
- 手机号结构:1 3 8 1 2 3 4 5 6 7 8
- 索引位置:0 1 2 3 4 5 6 7 8 9 10
2. 截取需脱敏部分
phone[3:7] // 取索引3到6的子串(左闭右开)
- 计算结果:"1234"(对应原手机号的第4-7位字符)
3. 执行替换
strings.Replace(phone, "1234", "****", 1)
- 参数说明
- phone:原始字符串
- "1234":被替换的子串
- "****":替换内容
- 1:仅替换第一次匹配(安全防护)
4. 最终输出
fmt.Println(masked) // 输出:138****5678
适用场景:
- 用户隐私数据展示(如日志、前端响应)
- 合规要求:符合 GDPR 等数据保护法规
- 扩展:身份证号、银行卡号类似处理
8. 性能及同类对比
性能特点
- 时间复杂度:O(n)(n 为字符串长度)
- 内存:单次分配,无额外碎片
对比其他方法(替换 1000 次 "a" -> "b")
方法 | 耗时 | 内存分配 |
strings.Replace | 0.8ms | 1次 |
strings.ReplaceAll | 0.9ms | 1次 |
bytes.Replace | 0.7ms | 1次 |
正则表达式 ReplaceAll | 12ms | 多次 |
9. 总结
特性说明
- 核心价值:简单子串替换的最优解
- 局限性:不支持正则或条件逻辑
对比总结表
维度 | strings.Replace | 替代方案 |
易用性 | ★★★★★(参数明确) | ★★(需编译正则) |
性能 | ★★★★★(最优) | ★★(正则表达式) |
功能范围 | ★★(固定子串) | ★★★★(正则/自定义) |
内存效率 | ★★★★★(零浪费) | ★★★(可能多分配) |
最终建议
- 黄金场景
- 批量替换模板变量
- 脱敏处理
- 替代方案
- 简单全替换用 ReplaceAll (Go 1.12+)
- []byte 操作用 bytes.Replace
- 注意事项
- 避免在循环中重复替换相同模式(应预编译正则)
- 替换空字符串会插入内容(可能不符合预期)
相关文章:
strings.Replace 使用详解
目录 1. 官方包 2. 支持版本 3. 官方说明 4. 作用 5. 实现原理 6. 推荐使用场景和不推荐使用场景 推荐场景 不推荐场景 7. 使用场景示例 示例1:官方示例 示例2:模板变量替换 示例3:敏感信息脱敏(隐藏手机号中间四位&a…...
K8S微服务部署及模拟故障观测
概述 本文介绍了如何在 Kubernetes (K8S) 集群中部署微服务,并模拟常见的故障场景(如 Pod 故障、节点故障、网络故障)以测试系统的容错能力。通过本实验,了解 Kubernetes 的自动恢复机制以及如何通过监控和日志分析快速定位和解决…...
3.k8s是如何工作的
Kubernetes 是一个复杂的分布式系统,其核心设计理念是 声明式管理 和 自动化控制。以下是 Kubernetes 的工作机制详解,从用户提交应用到容器运行的全流程: 1. 核心架构:控制平面(Control Plane)与工作节点&…...
打通任督二脉 - Device Plugin 让 k8s “看见” GPU
打通任督二脉 - Device Plugin 让 k8s “看见” GPU 上一篇咱们聊了为啥要把 GPU 这个“计算猛兽”拉进 Kubernetes (k8s) 这个“智能调度中心”。目标很美好:提高效率、简化管理、弹性伸缩。但现实是,k8s 天生并不认识 GPU 这位“新朋友”。就像你的电脑操作系统,默认只认…...
锚定“体验驱动”,锐捷EDN让园区网络“以人为本”
作者 | 曾响铃 文 | 响铃说 传统的网络升级路径,一如巴别塔的建造思路一般——工程师们按技术蓝图逐层堆砌,却常与地面用户的实际需求渐行渐远,从而带来了诸多体验痛点,如手工配置效率低下、关键业务用网无法保障、网络架构趋于…...
Flutter的自动化测试 python flutter编程
Flutter应用开发入门指南 第一步:创建Flutter应用 创建一个默认的Flutter应用后,将以下代码复制到 lib/main.dart 中: import package:flutter/material.dart;//运行Flutter应用,创建了一个自己实现的Widget对象 void main() > runApp(…...
Day09【基于jieba分词和RNN实现的简单中文分词】
基于jieba分词和RNN实现的中文分词 目标数据准备主程序预测效果 目标 本文基于给定的中文词表,将输入的文本基于jieba分词分割为若干个词,词的末尾对应的标签为1,中间部分对应的标签为0,同时将分词后的单词基于中文词表做初步序列…...
机器学习 | 神经网络介绍 | 概念向
文章目录 📚从生物神经元到人工神经元📚神经网络初识🐇激活函数——让神经元“动起来”🐇权重与偏置——调整信息的重要性🐇训练神经网络——学习的过程🐇过拟合与正则化——避免“死记硬背” 👀…...
使用cursor进行原型图设计
1.下载cursor 2.模式设置: 模型使用claude-3.7-sonnet的think模式 3.引导词模板: 我想要开发一个中高考英语口语考试的模拟考试系统,我需要将上面的这个应用输出成高保真的原型图设计。请考虑以下的规范: 用户体验࿱…...
Vue el-from的el-form-item v-for循环表单如何校验rules(二)
在上一篇文章中,通过校验规则写成内联循环去校验from表单项,在之前的代码基础上,进行校验规则的二次封装,使代码更加简洁,灵活高效、 参考上一篇:Vue el-from的el-form-item v-for循环表单如何校验rules&a…...
Spark-SQL3
Spark-SQL 一.Spark-SQL核心编程(四) 1.数据加载与保存: 1)通用方式: SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的数据&#…...
Redis字符串类型实战:解锁五大高频应用场景
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Redis的字符串(String)类型是最基础的数据结构,但其灵活性和原子性操作使其成为解决高并发场景问题的利器。本文通过真实项…...
通信算法之266: 无人机信号带宽计算
pwelch 通常返回功率谱密度(PSD)和对应的频率向量。带宽的计算可能涉及到找到 PSD 的有效频率范围,比如半功率点(-3dB)或者根据信号的能量集中区域。 pwelch 的参数设置,比如窗函数、重叠、FFT 点数&#x…...
【MySQL】前缀索引、索引下推、访问方法,自适应哈希索引
最左前缀原则 对于INDEX(name, age)来说最左前缀可以是联合索引的最左N个字段, 也可以是字符串索引的最左M个字符。 SELECT * FROM t WHERE name LIKE 张%其效果和单独创建一个INDEX(name)的效果是一样的若通过调整索引字段的顺序, 可以少维护一个索引树, 那么这个顺序就是需要…...
【C++游戏引擎开发】第16篇:ImGui指南
ImGui官方Github ImGUI(即时模式图形用户界面)是一种颠覆传统GUI开发范式的界面系统,由Casey Muratori于2005年提出概念,后经Omar Cornut开发为Dear ImGui开源库。其核心设计理念彻底改变了开发者构建交互式工具的方式。 一、vcpkg安装与特点介绍 1.1 安装 vcpkg install…...
分享一下这几天在公司学到的东西
这几天我学到了很多东西 (1)我自己原来写项目,前后端联调用的都是postman,然后直接测试接口,然后连一下就完了。这几天我接触到了apifox的Mock这个东西!我知道了一个前端工程师进行前后端链条的时候&#…...
C# 将Excel格式文件导入到界面中,用datagridview显示
界面按钮不做介绍。 主要代码: //用于获取从上一个页面传过来datagridview标题 public DataTable GetHeader { get; set; } private void UI_EXPINFO_Load(object sender, EventArgs e) { //页面加载显示listbox1中可…...
Shell编程之正则表达式与文本
目录 一 正则表达式 1 正则表达式的定义 2 正则表达式用途 二 正则表达式类型 1 基础正则表达式示例 (1)查找特定字符 (2)利用中括号” [] “来查找集合字符 (3)查找行首” ^ “与行尾字符”$“ &…...
Spring JDBC 与数据访问:从性能优化到事务协同
在高并发场景(如电商、金融等行业),数据库访问的性能和事务一致性是系统稳定性的关键。 Spring JDBC通过模板化操作和事务管理机制,大幅简化了传统 JDBC 繁琐的 API 处理,使数据库操作更加高效、安全、可维护。 一、…...
Markdown 编辑器的使用
欢迎使用 Markdown 编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&…...
自动化浏览器环境与 Node.js 环境的逆向分析:完整教程
在当今的 Web 开发中,了解浏览器环境与 Node.js 环境之间的差异是非常重要的,特别是当你希望进行自动化操作、逆向工程或进行跨平台开发时。在这篇教程中,我们将探讨如何通过 JavaScript 在浏览器中自动化环境检测、分析并对比 Node.js 和浏览…...
脉冲编码调制(PCM)在三角形信号中的应用
基于MATLAB平台,详细阐述脉冲编码调制(PCM)在三角形信号处理中的全流程实现。我这里将变量名更改为具有辨识度的Dogness_、Lhuu_,包括信号生成、均匀量化、编码、解码及解量化过程,为数字信号处理提供实践参考。 Dogne…...
# 03_Elastic Stack 从入门到实践(三)-- 4
03_Elastic Stack 从入门到实践(三)-- 4 七、Elasticsearch之中文分词器(IK分词器) 1、什么是分词? 分词:就是指将一个文本转化成一系列单词的过程,也叫文本分析,在Elasticsearch…...
前端VUE框架理论与应用(10)
1、记住全局注册的行为必须在根 Vue 实例 (通过 new Vue) 创建之前发生。 2、要注意,以 / 开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径。 3、注意:在 Vue 实例内部,你可以通过 $router 访问路由实例。因此你可以调用 this.$router.push…...
基础学习:(6)nanoGPT
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1 nanoGPT 浅尝1.1 基础环境1.2 prepare.py1.2 train.py1.3 sample.py 2 再探gpt2.1 layer_norm2.2 KQV 和 self attention2.3 masked self-attention2.4 调用构…...
python支持自定义基准的相对误差计算
def is_within_tolerance_custom(a, b, tolerance0.1, reference“max”): “”" 支持自定义基准的相对误差计算。 参数:reference (str): 基准类型,可选 "max"(默认)、"min"、"mean"、"a"&am…...
力扣DAY52-54 | 热100 | 图论:腐烂的橘子、课程表、前缀树
前言 中等 √ 腐烂的橘子用层次遍历,课程表用俩哈希表,前缀树基本与题解一致。however不太规范。 腐烂的橘子 我的题解 层次遍历,先找出所有腐烂的橘子进入队列并记录数量,接着内层遍历第一层腐烂的橘子,上下左右四…...
java CountDownLatch用法简介
CountDownLatch倒计数锁存器 CountDownLatch:用于协同控制一个或多个线程等待在其他线程中执行的一组操作完成,然后再继续执行 CountDownLatch用法 构造方法:CountDownLatch(int count),count指定等待的条件数(任务…...
科技项目验收测试报告有哪些作用?需要多长时间和费用?
在当今快速发展的科技环境中,科技项目的有效验收至关重要。对于公司、开发团队以及客户来说,科技项目验收测试报告更是一个不可缺少的一项重要环节。 科技项目验收测试报告是对一个项目在开发完成后所进行的一系列测试结果的总结。这份报告不仅用于证明…...
网络原理面试题
1.如何理解 URI? URI, 全称为(Uniform Resource Identifier), 也就是统一资源标识符,它的作用很简单,就是区分互联网上不同的资源。但是,它并不是我们常说的网址, 网址指的是URL, 实际上URI包含了URN和URL两个部分,由于 URL 过于普及,就默认将 URI 视为 URL 了。 URI 的…...
专为路由器和嵌入式设备设计的OpenWrt是什么?
OpenWrt是一款基于Linux内核的开源嵌入式操作系统,专为路由器和嵌入式设备设计。自2004年诞生以来,它已成为替代商业固件的首选方案,凭借其高度可定制性、模块化架构和活跃的开发者社区,广泛应用于家庭网络、企业级设备、物联网(IoT)及安全领域。以下从多个维度展开详细介…...
NVIDIA RTX™ GPU 低成本启动零售 AI 场景开发
零售行业正在探索应用 AI 升级客户体验,同时优化内部流程。面对多重应用场景以及成本优化压力,团队可采用成本相对可控的方案,来应对多重场景的前期项目预演和落地,避免短期内大规模投入造成的资源浪费。 客户体验 AI 场景的研究…...
element-ui自定义主题
此处的element-ui为基于vue2.x的 由于https://element.eleme.cn/#/zh-CN/theme/preview(element的主题)报错503, 所以使用https://element.eleme.cn/#/zh-CN/component/custom-theme 自定义主题文档中,在项目中改变scss变量的方…...
PhotoShop学习10
1.画板功能的使用 使用画板功能可以轻松针对不同的设备和屏幕尺寸设计网页和 APP。画板是一种容器,类似于特殊图层组。画板中的图层在图层面板中,按画板进行分组。 使用画板,一个文档中可以有多个设计版面,这样可以在画板之间轻…...
基于LLVM设计领域专用语言(DSL)的步骤——以激光微加工为例
1. 明确DSL的设计目标 在激光微加工领域,DSL需解决以下问题: • 工艺参数抽象化:激光功率、频率、扫描路径等需用高阶语法描述,而非底层G代码。 • 实时性要求:控制指令需低延迟编译为机器码(如FPGA或运动控…...
【MAUI】IOS保活
文章目录 概述sevice使用 概述 每种方法都是独立的,可以根据应用的需求单独使用。例如,如果应用的主要功能是跟踪用户的地理位置,则可以仅使用后台定位;若是为了保持应用在后台运行以完成特定任务(比如上传数据&#…...
shardingsphere-jdbc集成Seata分布式事务
1、导入相关依赖 <!-- shardingsphere-jdbc --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId><version>5.5.1</version></dependency><!-- shardingspher…...
基于区块链的技术应用探索
文章目录 前言一、区块链技术的核心特性1.1 去中心化1.2 不可篡改性1.3 透明性与可追溯性1.4 智能合约机制 二、区块链的典型应用场景2.1 金融与支付2.2 溯源与供应链管理2.3 数字身份与数据隐私2.4 数字资产与NFT2.5 公共服务与政务透明 三、区块链的分类1.按权限管理方式分类…...
MQ(RabbitMQ)消息重复消费问题的全面解决方案
MQ消息重复消费是分布式系统中的常见问题,主要由网络问题、消费者故障、消息重试机制等引起。以下是针对RabbitMQ的完整解决方案体系: 一、消息生产端解决方案 1. 消息幂等设计 全局唯一消息ID: MessageProperties props MessagePropert…...
windows Cursor 配置MCP的小坑
以高德地图MCP举例 按需求配置好以后,会提示 Client closed 解决方案, windows 需要更改一下 commandargs 新增一个npx保存后Cursor设置MCP页面Refresh一下即可,打开的终端不要关闭 最后贴一下文本代码,方便复制粘贴 {"m…...
探秘串口服务器厂家:背后的故事与应用
在科技飞速发展的今天,串口服务器作为连接串口设备与网络的桥梁,在工业自动化、智能交通、智能家居等众多领域发挥着关键作用。你是否好奇,那些生产串口服务器的厂家究竟有着怎样的故事?它们的产品背后又蕴含着怎样的原理呢&#…...
二叉树详细讲解(2/2)
4. 实现链式结构二叉树 ⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。通常的⽅法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址,其结构如下&#…...
SpringBoot整合Redis限流
通过一个完整的Spring Boot项目演示如何用Redis实现简单的API限流功能。我们将从零开始搭建项目。 一、环境准备 1.1 开发环境要求 JDK 1.8IntelliJ IDEA(推荐)Redis 5.0(本地安装)Postman(测试用) 1.2…...
(Matlab)自动驾驶仿真 设计驾驶场景、配置传感器并生成合成 数据
驾驶场景仿真平台核心功能 一、场景搭建与编辑 可视化场景构建 使用拖放界面创建道路网络和角色模型(车辆、行人等)支持欧洲新车评估计划(Euro NCAP)测试协议及其他预置场景模板 二、传感器配置 车载传感器系统 支持…...
接口测试(get请求方法)-----------实战演练
1.最简单的get请求方法 eg:请求一个王者荣耀语音包的接口 接口文档如下: 2.把接口地址、请求方法、请求参数写到postman相应位置 3.填写请求参数的值,点击发送按钮,即可获得到返回参数...
【赵渝强老师】TiDB的列存引擎:TiFlash
TiDB的TiFlash提供列式存储,且拥有借助ClickHouse高效实现的协处理器层。除此以外,它与TiKV非常类似,依赖同样的Multi-Raft体系,以Region为单位进行数据复制和分散。TiFlash以低消耗不阻塞TiKV写入的方式,实时复制TiKV…...
《vue3学习手记3》
标签的ref属性 vue3和vue2中的ref属性: 用在普通DOM标签上,获取的是DOM节点 ref用在组件标签上,获取的是组件实例对象 区别在于: 1.vue3中person子组件中的数据父组件App不能直接使用,需要引入并使用defineExpose才可…...
【Vue】从 MVC 到 MVVM:前端架构演变与 Vue 的实践之路
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–架构模式的演变背景三–MVC:经典的分层起点四–MVP:面向接口的解耦尝试五–MVVM:数据驱动的终极形态六–Vue:MVVM 的现代化实践 二. 架构模…...
Docker Compose 命令实现动态构建和部署
Docker Compose 命令实现动态构建和部署 一、编写支持动态版本号的 docker-compose.yml version: 3.8services:myapp:build: context: . # Dockerfile所在目录args:APP_VERSION: ${TAG:-latest} # 从环境变量获取版本号,默认latestimage: myapp:${TAG:-latest} …...
工厂模式实现案例
场景一:配置文件解析(工厂模式实现) 1. 定义解析器接口与具体实现 from abc import ABC, abstractmethod import json import yaml # 需要安装PyYAML库:pip install pyyamlclass ConfigParser(ABC):"""配置文件解…...