Go 中 strings 包常用函数

FreeGuideOnline 最新 2026-07-07

go import "strings"


---

## 字符串检查与判断

这些函数通常返回布尔值,用于快速验证字符串的内容特征。

### 包含判断 `Contains`
检查字符串是否包含子串,比 `Index` 更直观。
```go
strings.Contains("gopher", "go")   // true
strings.Contains("gopher", "rust") // false

前缀与后缀判断

  • HasPrefix(s, prefix string) bool:判断是否以指定前缀开头。
  • HasSuffix(s, suffix string) bool:判断是否以指定后缀结尾。
strings.HasPrefix("gopher", "go") // true
strings.HasSuffix("gopher", "er") // true

包含任意字符 ContainsAny

检查字符串是否包含指定字符集中的任意一个字符。

strings.ContainsAny("team", "i")      // false
strings.ContainsAny("failure", "u & i") // true,包含 'u' 和 'i'

包含 Unicode 码点 ContainsRune

检查字符串是否包含某个具体的 Unicode 字符(rune)。

strings.ContainsRune("你好", '好') // true
strings.ContainsRune("你好", 20320) // true,'你' 的 Unicode 码点

字符串查找与位置

当需要知道子串或字符出现的位置时,使用 Index 系列函数。

基础查找

  • Index(s, substr string) int:返回子串第一次出现的索引,不存在返回 -1。
  • LastIndex(s, substr string) int:返回最后一次出现的索引。
strings.Index("chicken", "ken") // 4
strings.Index("chicken", "dmr") // -1

查找任意字符 IndexAny

返回字符集中任意一个字符首次出现的索引。

strings.IndexAny("chicken", "aeiou") // 2,'i' 的位置

查找字节或码点

  • IndexByte(s string, c byte) int:查找单字节字符,性能比 Index 更好。
  • IndexRune(s string, r rune) int:查找 Unicode 码点。
strings.IndexByte("golang", 'g') // 0
strings.IndexRune("世界", '界')   // 3,每个中文字符占3字节

分割与拼接

将字符串拆分为切片或将切片合并成字符串是极其常见的操作。

分割 SplitSplitN

  • Split(s, sep string) []string:按分隔符全部分割,结果不会包含分隔符。
  • SplitN(s, sep string, n int) []string:限制分割后的元素个数,n < 0 时同 Split
strings.Split("a,b,c", ",")     // ["a" "b" "c"]
strings.SplitN("a,b,c", ",", 2) // ["a" "b,c"]

依空格分割 Fields

按空白字符(空格、制表符等)分割,自动去除空串,比 Split 更适用于处理单词。

strings.Fields("  foo bar  baz   ") // ["foo" "bar" "baz"]

拼接 Join

将字符串切片用指定分隔符连接成单个字符串。

strings.Join([]string{"a", "b", "c"}, "-") // "a-b-c"

重复 Repeat

将字符串重复指定次数。

strings.Repeat("na", 3) // "nanana"

大小写转换

strings 支持基本的 Unicode 大小写转换,适用于英语及一些其他语言。

转大写 ToUpper 与转小写 ToLower

strings.ToUpper("Gopher") // "GOPHER"
strings.ToLower("Gopher") // "gopher"

特殊标题形式 ToTitle

按照 Unicode 标题规则转换,与简单的 ToUpper 不同,某些语言中标题字符有专门形式。

strings.ToTitle("loud noises") // "LOUD NOISES" (对于大部分字符行为与 ToUpper 相似)
strings.ToTitle("α β γ")       // "Α Β Γ"

首字母大小写 Title

注意:strings.Title 在处理边界情况时已经废弃,建议使用 golang.org/x/text/cases 包。
这里仅作了解:

// 已废弃,不建议使用
// strings.Title("her royal highness") // "Her Royal Highness"

修剪与清除

去除字符串两端或首尾的特定字符。

去除空格 TrimSpace

去掉开头和结尾的空白字符(空格、\t、\n 等)。

strings.TrimSpace("  hello world  ") // "hello world"

自定义修剪 Trim

  • Trim(s, cutset string) string:去掉开头和结尾所有在 cutset 内的字符。
  • TrimLeftTrimRight:仅修剪左侧或右侧。
  • TrimPrefixTrimSuffix:精确修剪指定的前缀或后缀字符串。
strings.Trim("¡¡¡Hello, Gophers!!!", "!¡") // "Hello, Gophers"
strings.TrimPrefix("/tmp/file", "/tmp/")   // "file"
strings.TrimSuffix("/tmp/file", "/file")   // "/tmp"
// TrimLeft / TrimRight 示例
strings.TrimLeft("00123450", "0")  // "123450"
strings.TrimRight("00123450", "0") // "0012345"

替换与修改

在不破坏原字符串的前提下生成修改后的新字符串。

替换 ReplaceReplaceAll

  • Replace(s, old, new string, n int) string:将前 nold 替换为 newn < 0 时替换所有。
  • ReplaceAll(s, old, new string) string:等价于 Replace(s, old, new, -1)
strings.Replace("oink oink oink", "k", "ky", 2) // "oinky oinky oink"
strings.ReplaceAll("oink oink oink", "oink", "moo") // "moo moo moo"

映射转换 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
}
strings.Map(rot13, "'Twas brillig") // "'Gjnf oevyyvt"

字符串比较与排序

虽然字符串可以直接用 == 比较,但 strings 提供了面向排序的比较函数。

比较 Compare

按字典序比较两个字符串。由于 Go 字符串可以直接比较,通常直接使用 <>== 更自然。

strings.Compare("a", "b") // -1
strings.Compare("a", "a") // 0
strings.Compare("b", "a") // 1

忽略大小写的相等判断 EqualFold

在比较时忽略 Unicode 大小写差异,比简单转为小写再比较更准确。

strings.EqualFold("Go", "go") // true
strings.EqualFold("ß", "ss")  // true (某些语言的特殊折叠)

高级操作:构建与切割

Builder 类型:高效拼接字符串

当需要循环拼接大量字符串时,应使用 strings.Builder 替代 +=fmt.Sprintf,以减少内存分配。

var b strings.Builder
for i := 0; i < 5; i++ {
    b.WriteString("x")
}
result := b.String() // "xxxxx"

Reader 类型:将字符串转为 io.Reader

便于将字符串作为输入传给需要 io.Reader 的函数。

r := strings.NewReader("Hello, 世界")
buf := make([]byte, 4)
n, _ := r.Read(buf)
fmt.Println(string(buf[:n])) // "Hell"