文章目录
- Go 语言 strings 包常用方法详解
- 1. 字符串判断与查询
- Contains - 检查包含关系
- 前缀/后缀判断
- 字符位置查找
- 2. 字符串计数与比较
- Count - 统计出现次数
- Compare - 字符串比较
- EqualFold - 不区分大小写比较
- 3. 字符串变换
- 4. 字符串分割与连接
- 5. 重复与填充
- 6. 字符串遍历与处理
- 7. 实际应用示例
- 综合应用:字符串处理工具
- 性能优化:使用 Builder
- 8. 重要注意事项
Go 语言 strings 包常用方法详解
函数名 | 功能描述 |
---|
Contains | 检查字符串是否包含子串 |
ContainsAny | 检查是否包含任何指定字符 |
ContainsRune | 检查是否包含特定Unicode字符 |
HasPrefix | 检查前缀 |
HasSuffix | 检查后缀 |
Index | 查找子串第一次出现位置 |
LastIndex | 查找子串最后一次出现位置 |
IndexAny | 查找任何指定字符第一次出现 |
IndexRune | 查找Unicode字符位置 |
LastIndexAny | 查找任何指定字符最后一次出现 |
Count | 统计子串出现次数 |
Compare | 按字典序比较字符串 |
EqualFold | 不区分大小写比较 |
ToUpper | 转换为大写 |
ToLower | 转换为小写 |
ToTitle | 转换为标题格式 |
Trim | 去除指定字符 |
TrimSpace | 去除前后空白字符 |
TrimLeft | 去除左侧指定字符 |
TrimRight | 去除右侧指定字符 |
TrimPrefix | 去除前缀 |
TrimSuffix | 去除后缀 |
Replace | 替换字符串 |
ReplaceAll | 替换所有匹配项 |
Map | 使用函数进行字符替换 |
Split | 分割字符串 |
SplitN | 限制分割次数 |
SplitAfter | 分割但保留分隔符 |
Fields | 按空白字符分割 |
FieldsFunc | 使用自定义函数分割 |
Join | 连接字符串切片 |
Repeat | 重复字符串 |
strings.Builder | 高效字符串构建 |
1. 字符串判断与查询
Contains - 检查包含关系
package mainimport ("fmt""strings"
)func main() {fmt.Println(strings.Contains("hello world", "hello")) fmt.Println(strings.Contains("hello world", "foo")) fmt.Println(strings.ContainsAny("hello", "aeiou")) fmt.Println(strings.ContainsAny("hello", "xyz")) fmt.Println(strings.ContainsRune("hello", 'h')) fmt.Println(strings.ContainsRune("hello", 'z'))
}
前缀/后缀判断
func prefixSuffixDemo() {s := "hello world"fmt.Println(strings.HasPrefix(s, "hello")) fmt.Println(strings.HasPrefix(s, "world")) fmt.Println(strings.HasSuffix(s, "world")) fmt.Println(strings.HasSuffix(s, "hello"))
}
字符位置查找
func searchDemo() {s := "hello world, hello go"fmt.Println(strings.Index(s, "world")) fmt.Println(strings.Index(s, "python")) fmt.Println(strings.LastIndex(s, "hello")) fmt.Println(strings.IndexAny(s, "aeiou")) fmt.Println(strings.IndexRune(s, '世')) fmt.Println(strings.LastIndexAny(s, "aeiou"))
}
2. 字符串计数与比较
Count - 统计出现次数
func countDemo() {s := "banana"fmt.Println(strings.Count(s, "a")) fmt.Println(strings.Count(s, "an")) fmt.Println(strings.Count(s, "ana")) fmt.Println(strings.Count("five", ""))
}
Compare - 字符串比较
func compareDemo() {fmt.Println(strings.Compare("apple", "banana")) fmt.Println(strings.Compare("apple", "apple")) fmt.Println(strings.Compare("banana", "apple")) fmt.Println("apple" < "banana") fmt.Println("apple" == "apple")
}
EqualFold - 不区分大小写比较
func equalFoldDemo() {fmt.Println(strings.EqualFold("Go", "go")) fmt.Println(strings.EqualFold("Hello", "HELLO")) fmt.Println(strings.EqualFold("Go", "Python"))
}
3. 字符串变换
大小写转换
func caseDemo() {s := "Hello World"fmt.Println(strings.ToUpper(s)) fmt.Println(strings.ToLower(s)) fmt.Println(strings.ToTitle(s)) fmt.Println(strings.ToUpperSpecial(unicode.TurkishCase, "ı"))
}
修剪操作
func trimDemo() {s := " hello world "fmt.Printf("'%s'\n", strings.TrimSpace(s)) fmt.Println(strings.Trim("!!!hello!!!", "!")) fmt.Println(strings.TrimLeft("!!!hello!!!", "!")) fmt.Println(strings.TrimRight("!!!hello!!!", "!")) fmt.Println(strings.TrimPrefix("hello world", "hello ")) fmt.Println(strings.TrimSuffix("hello world", " world")) result := strings.TrimFunc("123hello456", func(r rune) bool {return r >= '0' && r <= '9'})fmt.Println(result)
}
替换操作
func replaceDemo() {s := "hello world, hello go"fmt.Println(strings.Replace(s, "hello", "hi", 1)) fmt.Println(strings.Replace(s, "hello", "hi", -1)) fmt.Println(strings.ReplaceAll(s, "hello", "hi")) result := strings.Map(func(r rune) rune {if r == 'o' {return '0' }return r}, "hello world")fmt.Println(result)
}
4. 字符串分割与连接
分割操作
func splitDemo() {s := "apple,banana,orange"parts := strings.Split(s, ",")fmt.Printf("%#v\n", parts) partsN := strings.SplitN(s, ",", 2)fmt.Printf("%#v\n", partsN) partsAfter := strings.SplitAfter(s, ",")fmt.Printf("%#v\n", partsAfter) fields := strings.Fields(" hello world\tgo\nlang ")fmt.Printf("%#v\n", fields) fieldsFunc := strings.FieldsFunc("apple,banana;orange", func(r rune) bool {return r == ',' || r == ';'})fmt.Printf("%#v\n", fieldsFunc)
}
连接操作
func joinDemo() {fruits := []string{"apple", "banana", "orange"}result := strings.Join(fruits, ", ")fmt.Println(result) words := []string{"hello", "world", "go"}fmt.Println(strings.Join(words, "::"))
}
5. 重复与填充
Repeat - 重复字符串
func repeatDemo() {fmt.Println(strings.Repeat("go", 3)) fmt.Println(strings.Repeat("-", 10)) fmt.Println(strings.Repeat("hello ", 2))
}
6. 字符串遍历与处理
字符遍历
func rangeDemo() {s := "hello世界"for i, r := range s {fmt.Printf("位置 %d: 字符 %c (Unicode: %U)\n", i, r, r)}fmt.Printf("字符串 '%s' 的长度:\n", s)fmt.Printf("字节数: %d\n", len(s))fmt.Printf("字符数: %d\n", utf8.RuneCountInString(s))
}
7. 实际应用示例
综合应用:字符串处理工具
package mainimport ("fmt""strings""unicode"
)
func stringUtils() {userInput := " Hello, World! "cleaned := strings.TrimSpace(userInput)fmt.Printf("清理后: '%s'\n", cleaned)filename := "document.pdf"if strings.HasSuffix(strings.ToLower(filename), ".pdf") {fmt.Println("这是一个PDF文件")}csvData := "John,25,Engineer\nJane,30,Designer"lines := strings.Split(csvData, "\n")for i, line := range lines {fields := strings.Split(line, ",")fmt.Printf("第%d行: %v\n", i+1, fields)}baseURL := "https://api.example.com"endpoints := []string{"users", "123", "profile"}fullURL := baseURL + "/" + strings.Join(endpoints, "/")fmt.Printf("完整URL: %s\n", fullURL)password := "Hello123"hasUpper := strings.IndexFunc(password, unicode.IsUpper) >= 0hasLower := strings.IndexFunc(password, unicode.IsLower) >= 0hasDigit := strings.IndexFunc(password, unicode.IsDigit) >= 0if hasUpper && hasLower && hasDigit {fmt.Println("密码强度足够")} else {fmt.Println("密码需要包含大小写字母和数字")}
}func main() {stringUtils()
}
性能优化:使用 Builder
func builderDemo() {var builder strings.Buildernames := []string{"Alice", "Bob", "Charlie"}for i, name := range names {if i > 0 {builder.WriteString(", ")}builder.WriteString(name)}result := builder.String()fmt.Println(result) builder.Reset()builder.WriteString("重新开始")fmt.Println(builder.String())
}
8. 重要注意事项
- 字符串不可变:所有操作都返回新字符串
- Unicode 安全:大多数函数正确处理 Unicode 字符
- 性能考虑:大量字符串操作时考虑使用
strings.Builder
- 空字符串处理:注意空字符串和 nil 的区别
func importantNotes() {var s1 string var s2 *string fmt.Printf("s1: '%s', is empty: %v\n", s1, s1 == "")fmt.Printf("s2: %v\n", s2)processString("")processString("hello")
}func processString(s string) {if strings.TrimSpace(s) == "" {fmt.Println("输入字符串为空或仅包含空白字符")return}fmt.Printf("处理字符串: %s\n", s)
}