当前位置:首页 > 文章列表 > Golang > Go教程 > Go strings.FieldsFunc 怎样按自定义规则切分文本

Go strings.FieldsFunc 怎样按自定义规则切分文本

来源:17golang原创 2026-10-20 06:23:49 0浏览 收藏

当一行文本同时允许空格、逗号和竖线分隔时,直接调用 strings.Split 往往要连续写几次替换或手工扫描。更直接的做法是使用 strings.FieldsFunc:给每个 Unicode 字符一个判定函数,返回 true 的字符被视为分隔符,最终得到一组非空字段。

官方地址:https://pkg.go.dev/strings#FieldsFunc

FieldsFunc 适合“分隔符由规则决定”的文本切分。它会丢弃首尾分隔符,把连续分隔符视为同一段分隔区域;如果必须保留空字段,应该改用 strings.Split。

先认清 FieldsFunc 的输入和结果

strings.FieldsFunc(s, f) 的回调签名是 func(rune) bool。遍历字符串时,回调收到的是 Unicode code point,而不是单个字节;返回 true 就表示当前字符属于分隔符。官方实现会按分隔符连续区间记录字段,因此每个结果元素都非空。

strings.FieldsFunc 接收字符串和 rune 判定函数并产生非空字段的静态结构图
图1:结构说明图展示字符串、rune 判定函数、分隔符区间和非空字段之间的关系,不是运行截图或执行证据。

先用一个最小例子把规则写清楚:

package main

import (
	"fmt"
	"strings"
)

func main() {
	text := "Go,标准库 | 文本处理"
	// 逗号、空格和竖线都作为分隔符,其他字符保留在字段中。
	isSeparator := func(r rune) bool {
		return r == ',' || r == ' ' || r == '|'
	}

	fields := strings.FieldsFunc(text, isSeparator)
	// %q 便于观察字段边界,不会把空字段隐藏成空白。
	fmt.Printf("%q\n", fields)
}

回调只负责回答“这个字符是不是分隔符”,不负责组装字段,也不应该依赖调用次数。把规则集中在一个小函数里,后面扩展制表符、换行或业务分隔符会更容易。

用 rune 规则覆盖多种分隔符

如果文本来自用户输入,分隔符通常不止一种。可以使用 unicode.IsSpace 处理 Unicode 空白,再叠加逗号和分号等业务字符。这样中文文本中的全角空格也能和普通空格走同一套规则。

package main

import (
	"strings"
	"unicode"
)

// splitTags 把空白和常见标点统一视为分隔符,并保留非空标签。
func splitTags(text string) []string {
	return strings.FieldsFunc(text, func(r rune) bool {
		// unicode.IsSpace 面向 rune 判断,能覆盖多种 Unicode 空白。
		return unicode.IsSpace(r) || r == ',' || r == ',' || r == ';' || r == ';'
	})
}

这个写法的关键是“按字符分类”,不是把所有分隔符拼成一个字符串再交给另一个 API。回调返回稳定的布尔值即可,字段内容不会因为分隔符的具体种类不同而产生额外空项。

连续分隔符和首尾分隔符会怎样

假设输入是 ",Go;;; strings ",如果回调把中文逗号、分号和空白都判为分隔符,结果只包含 Go 和 strings。开头和结尾的分隔符被丢弃,中间的连续分隔符也只形成一个边界,不会产生空字符串。

连续分隔符首尾分隔符与非空字段之间的静态边界关系图
图2:结构说明图展示首尾分隔符、连续分隔符和字段边界的关系,帮助理解 FieldsFunc 为什么不会返回空字段。

这正是它和 strings.Split 的主要差别之一:

需求更合适的函数结果特点
多种字符按规则切分FieldsFunc连续分隔符合并,结果元素非空
固定字符串作为分隔符Split按指定子串切分
空字段有业务含义Split可以保留相邻或首尾产生的空字符串

回调与 UTF-8 边界要留意什么

FieldsFunc 的回调以 rune 为单位,但返回的字段仍然是原字符串的切片。若后续要根据字段在原文中的位置做字节索引,必须区分“字符数量”和“字节偏移”;中文字符通常占用多个 UTF-8 字节,不能把 rune 下标直接当成字符串下标。

另外,官方文档不保证回调调用顺序,并假设同一个字符每次得到相同结果。因此不要在回调里累加状态、修改外部变量后再改变判定标准,也不要把随机值或时间作为分隔符规则。

package main

import (
	"strings"
	"unicode"
)

// fieldsFromLine 只根据当前字符决定边界,不读取会变化的外部状态。
func fieldsFromLine(line string) []string {
	return strings.FieldsFunc(line, func(r rune) bool {
		// 字段切分阶段保持纯判定,后续如需位置再单独遍历原文。
		return unicode.IsSpace(r) || r == '|'
	})
}

常见问题

FieldsFunc 能保留空字段吗?

不能。它会丢弃首尾分隔符,并把连续分隔符视为一个区间,返回的每个元素都非空。空字段有业务含义时,应考虑 strings.Split 或自定义扫描逻辑。

回调参数为什么是 rune 而不是 byte?

因为函数按 Unicode code point 判断字符,适合把 Unicode 空白或中文标点纳入规则。若业务协议明确按字节切分,则应先确认输入编码和接口约定。

FieldsFunc 和正则表达式怎么选?

只有字符级分类规则时,FieldsFunc 更直接、依赖更少;需要匹配多字符模式、捕获组或复杂上下文时,再考虑正则表达式或专用解析器。

总结来说,strings.FieldsFunc 的价值在于把“哪些字符算分隔符”交给一个稳定的 rune 判定函数。明确它会合并连续分隔符、丢弃首尾分隔符,并根据空字段需求和 strings.Split 做选择,就能把自定义文本切分写得简洁而可控。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go strings.Clone 怎样避免保留大字符串的底层内存Go strings.Clone 怎样避免保留大字符串的底层内存
上一篇
Go strings.Clone 怎样避免保留大字符串的底层内存
Go unicode/utf8.RuneCount 怎样统计字符数量
下一篇
Go unicode/utf8.RuneCount 怎样统计字符数量
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之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推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    557次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    606次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    633次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    589次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    413次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码