Go strings.CutPrefix 前缀不存在时如何保留原字符串
如果协议前缀是可选的,`strings.CutPrefix` 的正确用法是同时接收两个返回值:前缀存在时使用去掉前缀后的字符串;前缀不存在时直接保留原字符串,并根据 `found` 判断是否真的匹配。它不会因为匹配失败返回空串,也不会修改原字符串。
- `after, found := strings.CutPrefix(s, prefix)` 是判断和截取合并后的安全写法。
- 未匹配返回原字符串和 `false`;空前缀返回原字符串和 `true`。
- 该函数从 Go 1.20 开始提供;旧版本可用 `HasPrefix` 与切片实现等价逻辑。
先看懂 CutPrefix 的两个返回值
函数签名是 `func CutPrefix(s, prefix string) (after string, found bool)`。它只检查字符串开头是否完整等于 `prefix`:匹配时,`after` 是剩余部分;不匹配时,`after` 仍是原来的 `s`。因此不要只接收第一个返回值,否则“没有前缀”和“去掉前缀后恰好为空”会混在一起。
package main\n\nimport (\n "fmt"\n "strings"\n)\n\nfunc main() {\n samples := []string{"https://api.example.com/users", "api.example.com/users"}\n for _, raw := range samples {\n // found 记录是否真的剥离了协议前缀,避免把普通主机名误判为 HTTPS 地址。\n rest, found := strings.CutPrefix(raw, "https://")\n fmt.Printf("原值=%q,剩余=%q,匹配=%t\\n", raw, rest, found)\n }\n}第一行会得到 `api.example.com/users` 和 `true`;第二行得到原值和 `false`。这正是“有就去掉,没有就保留”的语义。

用 found 区分可选前缀与普通文本
在请求地址、消息头或文件名处理中,后续逻辑往往不仅关心剩余文本,还要知道输入是否带过某个标记。例如去除 `Bearer ` 后再交给令牌解析器时,只有 `found` 为 `true` 才能确认输入走过了这条协议分支。
func stripScheme(raw string) (string, string) {\n // 依次处理明确允许的协议;不匹配时保留 raw,调用方仍能识别 unknown。\n if rest, ok := strings.CutPrefix(raw, "https://"); ok {\n return "https", rest\n }\n if rest, ok := strings.CutPrefix(raw, "http://"); ok {\n return "http", rest\n }\n return "unknown", raw\n}这里不建议写成“先 CutPrefix,再依据剩余字符串猜协议”。因为地址可能本来就没有协议,猜测会把输入分类错误。返回值中的布尔量就是明确的证据。
空前缀、重复前缀和大小写要单独处理
空前缀是一个容易被忽略的边界:`strings.CutPrefix("abc", "")` 返回 `"abc", true`。这是因为空字符串出现在任何字符串的开头。若前缀来自可选配置,生产代码通常应先拒绝空配置,否则所有输入都会被当成“匹配成功”。
它只删除一次,并且大小写敏感。输入 `https://https://host` 只会去掉最左侧的一段;输入 `HTTPS://host` 不会匹配小写的 `https://`。如果业务真的允许大小写不敏感,应先明确规范化策略,再做协议判断,不能把这个函数当作大小写折叠工具。
| 输入 | 前缀 | after | found |
|---|---|---|---|
| `go.dev` | `https://` | `go.dev` | false |
| `https://go.dev` | `https://` | `go.dev` | true |
| `abc` | `""` | `abc` | true |
| `HTTPS://go.dev` | `https://` | `HTTPS://go.dev` | false |

旧版本 Go 如何保留相同语义
`CutPrefix` 是 Go 1.20 加入的 API。如果项目仍需支持更早版本,可以显式先判断前缀,再切片。关键是失败分支返回原字符串,而不是返回空串。
func cutPrefixCompat(s, prefix string) (string, bool) {\n // 先做字节前缀判断;HasPrefix 与字符串切片在这里保持 CutPrefix 的契约。\n if !strings.HasPrefix(s, prefix) {\n return s, false\n }\n return s[len(prefix):], true\n}切片边界使用 `len(prefix)`,因为 Go 的字符串下标按字节计算,而 `HasPrefix` 也按完整字节序列判断。不要先把字符串转成 `[]rune` 再用字节长度切片;那会让索引单位不一致。
常见问题
CutPrefix 失败时会返回空字符串吗?
不会。失败时返回原字符串和 `false`,空字符串只可能是原字符串本身为空,或匹配成功后剩余部分为空。
能用 CutPrefix 去除所有重复前缀吗?
不能。它只处理开头的一次匹配;需要循环时应先定义最大次数和异常输入策略。
CutPrefix 会自动忽略大小写吗?
不会。它是大小写敏感的字节前缀匹配,大小写不敏感需求应单独规范化。
资料参考:Go 标准库 `strings` 包文档中对 `CutPrefix` 的签名、Go 1.20 引入信息及失败返回语义。
Linux ss 查看监听端口为何看不到已建立连接
- 上一篇
- Linux ss 查看监听端口为何看不到已建立连接
- 下一篇
- LiblibAI文生图使用成本怎么算?额度、时间与交付评估
-
- Golang · Go教程 | 38分钟前 | 字符串 · go · 字节缓冲 · Go strings.Builder bytes.Buffer Grow
- Go strings.Builder Grow Builder 和 bytes.Buffer 选择哪个更合适
- 494浏览 收藏
-
- Golang · Go教程 | 48分钟前 |
- Go strings.Builder Grow String 调用后继续写入为什么有风险
- 398浏览 收藏
-
- Golang · Go教程 | 58分钟前 | 标准库 · 性能优化 · Go教程 · Go 内存分配 字符串拼接 strings.Builder Builder.Grow
- Go strings.Builder Grow 预估容量时怎么避免过度分配
- 292浏览 收藏
-
- Golang · Go教程 | 1小时前 | 标准库 · 正则表达式 · Go教程 · 数据导入 · CSV解析 · csv Go encoding/csv csv.Reader regexp.Split
- Go regexp.Split 用正则拆 CSV 为什么不可靠
- 112浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go regexp.Split n 参数为负数和零时分别表示什么
- 451浏览 收藏
-
- Golang · Go教程 | 1小时前 | go · regexp · 字符串处理 · 正则表达式 Go 字符串分割 regexp.Split
- Go regexp.Split 遇到空匹配时返回结果怎么判断
- 219浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go regexp.Longest 并发使用 Longest 配置时如何安排初始化
- 366浏览 收藏
-
- Golang · Go教程 | 2小时前 |
- Go regexp.Longest 适合用在词法分析的哪一层
- 292浏览 收藏
-
- Golang · Go教程 | 2小时前 |
- Go regexp.Longest 调用后为什么匹配结果会变化
- 432浏览 收藏
-
- Golang · Go教程 | 2小时前 |
- Go regexp.Compile 返回错误时如何把用户模式安全反馈
- 148浏览 收藏
-
- Golang · Go教程 | 2小时前 |
- Go regexp.FindAllStringSubmatchIndex Unicode 文本的字节下标怎么转换成字符区间
- 284浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 81次使用
-
- SuperCLUE
- SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
- 239次使用
-
- C-Eval
- 深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
- 166次使用
-
- AI Prompt Library
- 探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
- 99次使用
-
- Generrated
- Generrated汇集9300+张DALL·E生成图像及对应提示词,支持查看完整图集、对比DALL·E 2与3版本差异,是AI绘图新手学习Prompt设计与获取创作灵感的实用工具。
- 77次使用
-
- Go error wrapping 实战:别让错误日志只剩一句 failed
- 2026-06-01 151浏览
-
- Go pprof 排查慢接口:别只会看火焰图,先把问题问对
- 2026-06-01 101浏览
-
- Go Flight Recorder 实战:线上偶发卡顿,别再只靠日志碰运气
- 2026-06-01 323浏览
-
- Go testing/synctest 实战:别再用 time.Sleep 赌并发测试会过
- 2026-06-01 428浏览
-
- Go slog 生产实践:日志别只会打印 error,要能帮你排障
- 2026-06-01 143浏览
