Go语言 strings 包常用字符串处理方法详解
本文汇总了Go语言标准库 strings 中常用的字符串处理方法,涵盖子串查找、字符计数、分割连接、大小写转换及前后缀修剪等场景。通过具体的代码实例,详细说明各函数的输入参数、逻辑行为及返回值,为Go语言开发者提供实用的字符串操作参考。
子串查找与判断
第1步:使用 Contains 判断子串是否存在
strings.Contains 用于检测一个字符串是否包含另一个子串。如果子串为空字符串,函数始终返回 true;若主串为空且子串不为空,则返回 false。该函数对中文同样有效。
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.Contains("seafood", "foo")) // true
fmt.Println(strings.Contains("seafood", "bar")) // false
fmt.Println(strings.Contains("", "")) // true,特别注意此情况
fmt.Println(strings.Contains("我是中国人", "我")) // true
}
第2步:使用 ContainsAny 判断任意字符存在
strings.ContainsAny 接受一个包含多个字符的字符串作为第二个参数。只要第一个字符串中包含任意一个第二个字符串中的字符,即返回 true。注意:当第二个参数为空字符串时,返回 false。
fmt.Println(strings.ContainsAny("team", "i")) // false
fmt.Println(strings.ContainsAny("failure", "u & i")) // true
fmt.Println(strings.ContainsAny("foo", "")) // false
fmt.Println(strings.ContainsAny("", "")) // false
第3步:使用 ContainsRune 检查单个字符
与 ContainsAny 类似,但 strings.ContainsRune 的第二个参数是单个字符(rune),效率略高。
fmt.Println(strings.ContainsRune("我是中国", '我')) // true
统计与比较
第4步:Count 统计子串出现次数
strings.Count 计算子串在字符串中出现的非重叠次数。如果子串为空字符串,返回值等于 runes(Unicode码点)的数量加1。
fmt.Println(strings.Count("cheese", "e")) // 3
fmt.Println(strings.Count("five", "")) // 5 (before & after each rune result: 5)
第5步:EqualFold 忽略大小写比较
strings.EqualFold 进行 Unicode 简单折叠(case-insensitive)比较,适用于跨语言的大小写不敏感匹配。
fmt.Println(strings.EqualFold("Go", "go")) // true
分割与重组
第6步:Fields 按空白符分割
strings.Fields 将字符串按连续的 Unicode 空白符(如空格、Tab、换行)分割,并自动过滤空结果,返回字符串切片。
fmt.Printf("%q\n", strings.Fields(" foo bar baz "))
// 输出: ["foo" "bar" "baz"]
对于自定义分隔符,可以使用 strings.FieldsFunc,传入一个判断字符是否为分隔符的匿名函数:
for _, record := range []string{"aaa*1892*122", "124|939|22"} {
fmt.Println(strings.FieldsFunc(record, func(ch rune) bool {
return ch == '*' || ch == '|'
}))
}
第7步:Split 系列函数灵活切割
strings.Split 是最基础的切割函数。
SplitN:限制切割次数。若 n <= 0,返回全部分割结果;n=1 返回原串;n>1 表示最多切出 n 个片段。SplitAfter/SplitAfterN:保留分隔符在分割后的元素末尾。
// 基本分割
fmt.Printf("%q\n", strings.Split("a,b,c", ",")) // ["a" "b" "c"]
// SplitN 示例:限制切割次数
fmt.Printf("%q\n", strings.SplitN("a,b,c", ",", 2)) // ["a" "b,c"]
fmt.Printf("%q\n", strings.SplitN("a,b,c", ",", -1)) // ["a" "b" "c"]
// SplitAfter 示例:保留分隔符
fmt.Printf("%q\n", strings.SplitAfter("/home/m_ta/src", "/"))
// ["/" "home/" "m_ta/" "src"]
第8步:Join 拼接字符串
strings.Join 将字符串切片用指定分隔符连接成一个新字符串,比循环拼接更高效。
s := []string{"foo", "bar", "baz"}
fmt.Println(strings.Join(s, ", ")) // "foo, bar, baz"
索引定位
第9步:Index 与 LastIndex 查找位置
strings.Index 返回子串第一次出现的索引,未找到返回 -1。strings.LastIndex 返回最后一次出现的索引。两者均支持多字节字符(UTF-8),但在 Go 1.18+ 版本中对多字节的计算方式保持一致(基于字节索引)。注意:LastIndexAny 查找的是任一字符的最后一次出现位置。
fmt.Println(strings.Index("NLT_abc", "abc")) // 4
fmt.Println(strings.LastIndex("go gopher", "go")) // 3
fmt.Println(strings.LastIndexAny("go gopher", "go")) // 4 ('o' 的最后位置)
替换与映射
第10步:Replace 批量或有限替换
strings.Replace 第三个参数控制替换次数:
- n > 0:替换前 n 次。
- n <= 0:替换所有出现的位置。
// 替换前2个 'k' 为 'ky'
fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
// "oinky oinky oink"
// 替换所有 'oink' 为 'moo'
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))
// "moo moo moo"
第11步:Map 逐个字符映射变换
strings.Map 对每个字符执行用户提供的函数。如果函数返回负数,则该字符被移除;否则返回新字符。常用于字符编码转换或清洗。
rot13 := func(r rune) rune {
switch {
case r >= 'A' && r <= 'Z':
return 'A' + (r-'A'+13)%26
case r >= 'a' && r <= 'z':
return 'a' + (r-'a'+13)%26
}
return r
}
fmt.Println(strings.Map(rot13, "'Twas brillig and the slithy gopher..."))
前后缀判断
第12步:HasPrefix 与 HasSuffix
分别用于判断字符串是否以指定前缀或后缀开始/结束。
fmt.Println(strings.HasPrefix("NLT_abc", "NLT")) // true
fmt.Println(strings.HasSuffix("NLT_abc", "abc")) // true
大小写转换
第13步:ToLower、ToUpper 与 ToTitle
这些函数进行简单的 ASCII 或 Unicode 折叠转换。
- ToLower/ToUpper:转换小写/大写。
- ToTitle:将每个单词的首字母及特定 Unicode 字符转换为标题格式(通常等效于大写,但对特殊字符如德语ß有专门处理)。
fmt.Println(strings.ToLower("Gopher")) // "gopher"
fmt.Println(strings.ToUpper("Gopher")) // "GOPHER"
fmt.Println(strings.ToTitle("loud noises")) // "LOUD NOISES"
修剪空白与字符
第14步:Trim 相关函数清理首尾字符
strings.TrimSpace:去除首尾所有 Unicode 空白字符(空格、制表符、换行等)。strings.Trim(s, cutset):去除首尾所有出现在cutset中的字符。strings.TrimLeft/TrimRight:仅去除左侧或右侧的指定字符。
// 去除首尾的非空白字符 '!' 和空格
fmt.Printf("[%q]\n", strings.Trim(" !!! Achtung !!! ", "! "))
// ["Achtung"]
// 仅去除左侧
fmt.Printf("[%q]\n", strings.TrimLeft(" !!! Achtung !!! ", "! "))
// ["Achtung !!! "]
// 去除所有空白
fmt.Println(strings.TrimSpace(" \t\n a lone gopher \n\t\r\n"))
// "a lone gopher"
以上就是Go语言strings包常用字符串处理函数的详细内容,更多关于Go语言开发技巧的资料请关注本站其它相关文章!本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













