引入

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 表示全部替换。ReplaceAllReplace(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高性能字符串拼接

特点

  • 所有操作都是纯函数,不修改原字符串,返回新值
  • IndexLastIndex 返回的是字节位置,不是字符位置
  • Split 严格切,Fields 智能切(按空白、去空串)
  • ReplaceAllReplace(s, o, n, -1) 更简洁,推荐用前者
  • Join 是切片转字符串的标准做法
  • Builder 适合循环中大量拼接,性能远优于 +
  • strings 包只处理 UTF-8 字符串,字节级操作用 bytes

理解

strings 包就是把日常字符串操作封装成了一套现成函数。查找用 Contains / Index,替换用 ReplaceAll,切割用 Split / Fields,拼接用 Join / Builder,去空白用 TrimSpace。记住这些就够应付绝大多数场景了。核心一点:不修改原字符串,都返回新值

引出

strings 包处理的是字符串的文本操作,但字符串和数字之间的转换需要另一套工具。接下来看 Go strconv 包,学习字符串和数字互转的标准方式。