Go x/text/runes Remove 怎样删除指定字符集合
Go 的 runes.Remove 接收一个字符集合 Set,删除其中命中的 Unicode 码点。对于少量指定字符,可以用 runes.Predicate 构造判断函数,再调用返回的 Transformer.String 得到新字符串;它处理的是 UTF-8 文本中的 rune,不是某段子字符串。
官方文档入口:https://pkg.go.dev/golang.org/x/text/runes。本文用“仅删除下划线和中点”的导入显示名作为例子,说明字符规则、输入和清理结果如何关联,不把删除操作扩大成通用文本修复。
先约定哪些字符可以删除
假设显示名由外部系统导入,业务明确要求去掉 ASCII 下划线 _ 和中点 ·,中文、字母、空格与其他标点保持原有内容。这个约定可以表达成两个 rune 的集合,清理发生在生成展示副本时,原始文本另行保留。
先定义删除集合,可以避免“删除标点”这样的宽泛规则误伤人名或编号。空格是否可以删除、全角下划线是否也在范围内,都需要单独约定。图中的规则配置、下划线、中点、Predicate、Remove、展示副本对应这一输入契约。

用 Predicate 描述精确字符集合
下面给出可放入项目的最小函数。依赖通过项目 go.mod 管理,使用与当前工具链兼容的 x/text 版本。每次函数调用创建转换器,调用方不需要管理复用状态。
package displayname
import (
"fmt"
"unicode/utf8"
"golang.org/x/text/runes"
)
// CleanDisplayName 只删除约定的下划线与中点,保留其他码点。
func CleanDisplayName(input string) (string, error) {
// 在转换前拒绝非法 UTF-8,避免把修复后的文本误当作原文。
if !utf8.ValidString(input) {
return "", fmt.Errorf("显示名不是有效 UTF-8")
}
unwanted := runes.Predicate(func(r rune) bool {
// true 表示属于待删除集合,false 表示保留。
return r == '_' || r == '·'
})
cleaner := runes.Remove(unwanted)
return cleaner.String(input), nil
}
按这段规则,示例输入 仓_库·北区 A 的预期结果为 仓库北区 A,其中空格保留。这里是代码语义示例,没有声称已经执行。不要给 String 接收两个返回值:runes.Transformer.String 的签名直接返回 string,与 transform.String 的多返回值接口不同。
Remove 的官方说明把删除条件定义为 Set.Contains(r);Predicate 把判断函数封装成 Set。判断函数应只描述集合归属,不依赖调用次数或字符之前的位置。涉及相邻字符或整段匹配时,应另外选择适合该规则的处理方式。
输入合法性与清理结果分别处理
输入字节是否构成合法 UTF-8,与某个 rune 是否需要删除,是两个不同问题。Remove 会先把非法输入字节按 RuneError 处理后再进行集合判断;因此它不适合充当“发现输入异常就拒绝”的完整入口。本例在调用之前使用 utf8.ValidString,明确选择拒绝非法编码。
这不是要求所有清理任务必须拒绝异常输入。如果业务允许修复,应在契约中说明替换行为并保留原始输入;不要通过把 RuneError 加入删除集合来掩盖源数据问题,因为原文也可能合法包含 U+FFFD。
依据 utf8.ValidString 文档,它判断字符串是否完全由合法 UTF-8 编码的 rune 组成。这个判断不保证字段符合业务格式,也不会自动处理规范化、大小写和人类可见字符的组合。
保留原文与规则版本的对应关系
删除是有损操作,结果不适合替代所有用途的原文。例如 仓_库 和 仓库 都可能得到同一个展示副本。若业务以清理结果做查重键,需要明确这种合并是否允许,而不是默认它们代表同一实体。

可以在应用记录中保留“原始文本”“规则版本”“展示副本”“查询字段”,再由展示组件读取展示副本,追溯记录关联原始文本与规则版本。图中的六个节点是数据设计示意,不是本包自动创建的数据表。
| 对象 | 建议用途 |
|---|---|
| 原始文本 | 保留来源,供规则调整后重新生成 |
| 规则版本 | 区分删除集合变更前后的含义 |
| 展示副本 | 页面展示,不默认作为唯一标识 |
| 查询字段 | 依据检索需求单独定义生成规则 |
入库时让这些字段与当前记录保持一致,更新删除集合后再决定哪些旧记录需要重新生成。不要对清理后的字节偏移继续套用原文位置,删除字符会改变后续位置。展示副本也不等于 HTML 转义后的安全输出,呈现时仍应采用目标格式的正常编码方式。
常见删除需求怎样选择
怎样删除 Unicode 某一类字符?可以把对应 unicode.RangeTable 交给 runes.In,再传给 Remove。但范围可能远大于几个明确标点,使用前先确认该分类与业务契约一致。
只想删除开头和结尾的字符怎么办?Remove 会删除整个字符串内命中的 rune,不区分首尾。首尾裁剪应使用相应字符串裁剪方法,不要直接用这个函数替代。
能否一次删除整段词语?Predicate 的参数只有当前 rune;把词语的每个字放进集合,会删掉这些字在其他位置的出现,不能表达整段词语匹配。
删除后为什么视觉形态变了?rune 是码点层面的单位,部分可见字符由多个码点组成。删除组合标记可能改变文字含义,Remove 本身不会自动完成规范化或按用户感知字符分组。应先把删除范围缩小到已确认的码点,再决定是否需要专门的文本规则。
Go x/text/number Decimal 怎样控制最小小数位
- 上一篇
- Go x/text/number Decimal 怎样控制最小小数位
- 下一篇
- Go x/text/search Pattern 怎样复用多次文本查找
-
- Golang · Go教程 | 1分钟前 |
- Go cfg.New 怎样为函数体建立控制流图
- 393浏览 收藏
-
- Golang · Go教程 | 5分钟前 |
- Go typeutil.Map 怎样使用类型对象作为键
- 449浏览 收藏
-
- Golang · Go教程 | 5分钟前 |
- Go x/image/font/sfnt GlyphIndex 怎样查询字符对应字形
- 318浏览 收藏
-
- Golang · Go教程 | 6分钟前 |
- Go packages.Load 怎样加载指定文件集的包信息
- 378浏览 收藏
-
- Golang · Go教程 | 7分钟前 |
- Go x/text/encoding/charmap EncodeRune 怎样判断字符能否编码
- 404浏览 收藏
-
- Golang · Go教程 | 7分钟前 | go · Go x/text/encoding/japanese ISO2022JP ISO-2022-JP
- Go x/text/encoding/japanese ISO2022JP 怎样读取带状态转义文本
- 134浏览 收藏
-
- Golang · Go教程 | 10分钟前 |
- Go x/text/currency Rounding 怎样取得金额显示舍入位数
- 382浏览 收藏
-
- Golang · Go教程 | 12分钟前 |
- Go x/text/cases Upper 怎样处理土耳其语字母
- 374浏览 收藏
-
- Golang · Go教程 | 14分钟前 |
- Go x/text/collate Numeric 怎样按文本中的数字排序
- 500浏览 收藏
-
- Golang · Go教程 | 18分钟前 |
- Go debug/dwarf Reader.SkipChildren 怎样跳过嵌套条目
- 166浏览 收藏
-
- Golang · Go教程 | 20分钟前 |
- Go x/image/font/opentype ParseCollection 怎样读取字体集合
- 165浏览 收藏
-
- Golang · Go教程 | 21分钟前 |
- Go x/image/riff Next 怎样遍历容器块
- 170浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 722次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 731次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 805次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 768次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 606次使用
-
- Java 性能优化上线清单:从定位、改造到灰度发布
- 2026-06-11 860浏览
-
- Spring Boot 压测验证:Gatling、JMeter 与性能回归门禁
- 2026-06-11 843浏览
-
- Java NMT 非堆内存排查:Direct Buffer、线程栈与 Metaspace 分析
- 2026-06-11 826浏览
-
- Spring Boot 容器内存优化:JVM 堆、非堆与 MaxRAMPercentage
- 2026-06-11 809浏览
-
- Tomcat 连接与线程参数调优:maxThreads、acceptCount 与 KeepAlive
- 2026-06-11 792浏览

