Go语言 strings 包常用字符串处理方法详解

许南星
许南星
发布时间:2026-10-14| 5人浏览过
原创

本文汇总了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语言开发技巧的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。