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字节
分割与拼接
将字符串拆分为切片或将切片合并成字符串是极其常见的操作。
分割 Split 与 SplitN
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内的字符。TrimLeft、TrimRight:仅修剪左侧或右侧。TrimPrefix、TrimSuffix:精确修剪指定的前缀或后缀字符串。
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"
替换与修改
在不破坏原字符串的前提下生成修改后的新字符串。
替换 Replace 与 ReplaceAll
Replace(s, old, new string, n int) string:将前n个old替换为new,n < 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"