当前位置:首页 > 文章列表 > Golang > Go教程 > Go strings.CutPrefix 前缀不存在时如何保留原字符串

Go strings.CutPrefix 前缀不存在时如何保留原字符串

来源:17golang原创 2026-09-11 12:23:09 0浏览 收藏

如果协议前缀是可选的,`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`。这正是“有就去掉,没有就保留”的语义。

Go strings.CutPrefix 前缀匹配与原字符串保留的静态函数关系图
图1:围绕 CutPrefix 的输入、前缀比较、after 返回值和 found 标志,理解匹配与保留原字符串的静态关系。

用 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://`。如果业务真的允许大小写不敏感,应先明确规范化策略,再做协议判断,不能把这个函数当作大小写折叠工具。

输入前缀afterfound
`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 strings.CutPrefix 空前缀重复前缀和大小写边界静态关系图
图2:把前缀配置、一次匹配、大小写比较和调用方分支放在同一张边界图中,定位“看似没截取”的原因。

旧版本 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 引入信息及失败返回语义。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Linux ss 查看监听端口为何看不到已建立连接Linux ss 查看监听端口为何看不到已建立连接
上一篇
Linux ss 查看监听端口为何看不到已建立连接
LiblibAI文生图使用成本怎么算?额度、时间与交付评估
下一篇
LiblibAI文生图使用成本怎么算?额度、时间与交付评估
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    81次使用
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    239次使用
  • C-Eval中文评测基准:大语言模型多学科能力评估指南
    C-Eval
    深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
    166次使用
  • AI Prompt Library:免费AI提示词库,助力ChatGPT高效创作与营销
    AI Prompt Library
    探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
    99次使用
  • Generrated:DALL·E 2/3 AI绘画提示词灵感库与图像对比平台
    Generrated
    Generrated汇集9300+张DALL·E生成图像及对应提示词,支持查看完整图集、对比DALL·E 2与3版本差异,是AI绘图新手学习Prompt设计与获取创作灵感的实用工具。
    77次使用