引入
Go 字符串 讲了字符串的基本类型特性,但日常开发中对字符串的操作远不止创建和拼接。查找子串、替换内容、按分隔符切割、去除空白——这些都需要一套趁手的工具。strings 包就是 Go 提供的字符串操作标准库,函数丰富且高效。
正文
定义
定义
strings包提供对 UTF-8 编码字符串的常用操作函数,包括查找、替换、分割、拼接、大小写转换等。所有函数都是纯函数,不修改原字符串,返回新字符串或结果值。
语法
import "strings"
// 查找
strings.Contains("hello world", "world") // true
strings.Index("hello world", "world") // 6
// 替换
strings.Replace("hello world", "world", "Go", 1) // "hello Go"
// 分割和拼接
strings.Split("a,b,c", ",") // ["a", "b", "c"]
strings.Join([]string{"a", "b", "c"}, "-") // "a-b-c"例子
查找
s := "Hello, World!"
strings.Contains(s, "World") // true,是否包含子串
strings.HasPrefix(s, "Hello") // true,是否以指定前缀开头
strings.HasSuffix(s, "!") // true,是否以指定后缀结尾
strings.Index(s, "World") // 7,子串首次出现的位置
strings.LastIndex(s, "l") // 10,子串最后出现的位置
strings.Count(s, "l") // 3,子串出现次数Index 返回的是字节位置,找不到返回 -1。对于包含中文的字符串,字节位置和字符位置可能不同。
替换
s := "foo bar foo baz"
strings.Replace(s, "foo", "qux", 1) // "qux bar foo baz"(只替换第 1 个)
strings.Replace(s, "foo", "qux", -1) // "qux bar qux baz"(替换所有)
strings.ReplaceAll(s, "foo", "qux") // "qux bar qux baz"(替换所有,更简洁)Replace 的最后一个参数控制替换次数,-1 表示全部替换。ReplaceAll 是 Replace(s, old, new, -1) 的简写。
分割
strings.Split("a,b,c", ",") // ["a", "b", "c"]
strings.Split("a,,b,c", ",") // ["a", "", "b", "c"](空字符串也会保留)
strings.SplitN("a,b,c,d", ",", 2) // ["a", "b,c,d"](最多切成 2 份)
strings.Fields(" hello world ") // ["hello", "world"](按空白分割,自动忽略多余空格)Split 严格按分隔符切,Fields 按任意空白字符切且自动去空,处理不规则输入时更方便。
拼接
// Join 把字符串切片拼成一个字符串
strings.Join([]string{"2026", "07", "20"}, "-") // "2026-07-20"
strings.Join([]string{"a", "b", "c"}, "") // "abc"
// Repeat 重复拼接
strings.Repeat("ab", 3) // "ababab"Join 是切片转字符串的首选方式,比循环用 + 拼接性能好得多。
大小写和修剪
strings.ToUpper("hello") // "HELLO"
strings.ToLower("HELLO") // "hello"
strings.Title("hello world") // "Hello World"(已废弃,用 cases 包替代)
strings.TrimSpace(" hello ") // "hello"
strings.Trim("!!hello!!", "!") // "hello"
strings.TrimPrefix("!!hello", "!") // "!hello"(只去一个前缀)
strings.TrimSuffix("hello!!", "!") // "hello!"(只去一个后缀)TrimSpace 去除首尾所有空白字符(空格、制表符、换行符),处理用户输入时特别常用。
Builder
var sb strings.Builder
for i := 0; i < 1000; i++ {
sb.WriteString("hello ")
sb.WriteString("world ")
}
result := sb.String()strings.Builder 是大量拼接字符串时的性能之选。内部维护一个字节缓冲区,避免了 + 拼接每次创建新字符串的开销。
常见写法
| 函数 | 说明 |
|---|---|
strings.Contains(s, sub) | 是否包含子串 |
strings.HasPrefix(s, pre) | 是否以指定前缀开头 |
strings.HasSuffix(s, suf) | 是否以指定后缀结尾 |
strings.Index(s, sub) | 子串首次出现的位置 |
strings.Replace(s, old, new, n) | 替换 n 次,-1 表示全部 |
strings.ReplaceAll(s, old, new) | 替换所有 |
strings.Split(s, sep) | 按分隔符切割 |
strings.Join(ss, sep) | 切片拼接为字符串 |
strings.Fields(s) | 按空白字符切割 |
strings.TrimSpace(s) | 去除首尾空白 |
strings.ToUpper(s) | 转大写 |
strings.ToLower(s) | 转小写 |
strings.Repeat(s, n) | 重复 n 次 |
strings.Builder | 高性能字符串拼接 |
特点
- 所有操作都是纯函数,不修改原字符串,返回新值
Index和LastIndex返回的是字节位置,不是字符位置Split严格切,Fields智能切(按空白、去空串)ReplaceAll比Replace(s, o, n, -1)更简洁,推荐用前者Join是切片转字符串的标准做法Builder适合循环中大量拼接,性能远优于+strings包只处理 UTF-8 字符串,字节级操作用bytes包
理解
strings 包就是把日常字符串操作封装成了一套现成函数。查找用 Contains / Index,替换用 ReplaceAll,切割用 Split / Fields,拼接用 Join / Builder,去空白用 TrimSpace。记住这些就够应付绝大多数场景了。核心一点:不修改原字符串,都返回新值。
引出
strings 包处理的是字符串的文本操作,但字符串和数字之间的转换需要另一套工具。接下来看 Go strconv 包,学习字符串和数字互转的标准方式。