Go语言的字符串处理

张开发
2026/4/16 20:17:11 15 分钟阅读

分享文章

Go语言的字符串处理
Go语言的字符串处理1. 字符串的基础概念1.1 字符串的表示字符串是由一系列字符组成的序列在Go语言中字符串是不可变的字符串使用双引号或反引号表示1.2 字符串的内部实现Go语言中的字符串底层是字节数组字符串的长度是字节数不是字符数支持UTF-8编码2. 字符串的基本操作2.1 字符串的创建package main import fmt func main() { // 使用双引号创建字符串 s1 : Hello, World! fmt.Println(s1) // 使用反引号创建多行字符串 s2 : Hello, World! fmt.Println(s2) // 空字符串 s3 : fmt.Println(Empty string:, s3) }2.2 字符串的长度package main import fmt func main() { s : Hello, World! // 获取字节长度 length : len(s) fmt.Println(Length:, length) // 获取字符数量考虑UTF-8编码 count : 0 for range s { count } fmt.Println(Character count:, count) }2.3 字符串的拼接package main import ( fmt strings ) func main() { // 使用运算符拼接 s1 : Hello World fmt.Println(s1) // 使用strings.Builder var builder strings.Builder builder.WriteString(Hello) builder.WriteString( ) builder.WriteString(World) s2 : builder.String() fmt.Println(s2) // 使用fmt.Sprintf s3 : fmt.Sprintf(%s %s, Hello, World) fmt.Println(s3) }3. 字符串的比较3.1 相等性比较package main import fmt func main() { s1 : Hello s2 : Hello s3 : World // 相等性比较 fmt.Println(s1 s2:, s1 s2) fmt.Println(s1 s3:, s1 s3) }3.2 字典序比较package main import ( fmt strings ) func main() { s1 : apple s2 : banana s3 : Apple // 字典序比较 fmt.Println(s1 s2:, s1 s2) fmt.Println(s1 s3:, s1 s3) // 注意大写字母的ASCII值小于小写字母 // 忽略大小写比较 fmt.Println(strings.EqualFold(s1, s3):, strings.EqualFold(s1, s3)) }4. 字符串的搜索和替换4.1 搜索子串package main import ( fmt strings ) func main() { s : Hello, World! // 查找子串位置 index : strings.Index(s, World) fmt.Println(Index of World:, index) // 从指定位置开始查找 index2 : strings.Index(s[7:], World) fmt.Println(Index of World from position 7:, index2) // 查找最后一个匹配的子串 lastIndex : strings.LastIndex(s, o) fmt.Println(Last index of o:, lastIndex) // 检查字符串是否包含子串 contains : strings.Contains(s, World) fmt.Println(Contains World:, contains) }4.2 替换子串package main import ( fmt strings ) func main() { s : Hello, World! // 替换所有匹配的子串 replaced : strings.ReplaceAll(s, World, Go) fmt.Println(Replaced:, replaced) // 替换指定次数的子串 replaced2 : strings.Replace(s, o, 0, 2) fmt.Println(Replaced first 2 os:, replaced2) }5. 字符串的分割和连接5.1 分割字符串package main import ( fmt strings ) func main() { s : apple,banana,orange // 按逗号分割 parts : strings.Split(s, ,) fmt.Println(Split by ,:, parts) // 按空格分割 s2 : Hello World Go parts2 : strings.Fields(s2) fmt.Println(Split by spaces:, parts2) // 按换行符分割 s3 : Hello\nWorld\nGo parts3 : strings.Split(s3, \n) fmt.Println(Split by newlines:, parts3) }5.2 连接字符串package main import ( fmt strings ) func main() { parts : []string{apple, banana, orange} // 用逗号连接 joined : strings.Join(parts, ,) fmt.Println(Joined with ,:, joined) // 用空格连接 joined2 : strings.Join(parts, ) fmt.Println(Joined with spaces:, joined2) }6. 字符串的大小写转换package main import ( fmt strings ) func main() { s : Hello, World! // 转换为小写 lower : strings.ToLower(s) fmt.Println(Lowercase:, lower) // 转换为大写 upper : strings.ToUpper(s) fmt.Println(Uppercase:, upper) // 首字母大写 title : strings.Title(s) fmt.Println(Title case:, title) }7. 字符串的修剪package main import ( fmt strings ) func main() { s : Hello, World! // 修剪首尾空格 trimmed : strings.TrimSpace(s) fmt.Println(Trimmed:, trimmed) // 修剪指定字符 s2 : ###Hello, World!### trimmed2 : strings.Trim(s2, #) fmt.Println(Trimmed #s:, trimmed2) // 修剪前缀 trimmed3 : strings.TrimPrefix(s2, ###) fmt.Println(Trimmed prefix:, trimmed3) // 修剪后缀 trimmed4 : strings.TrimSuffix(s2, ###) fmt.Println(Trimmed suffix:, trimmed4) }8. 字符串的编码和解码8.1 UTF-8编码package main import ( fmt unicode/utf8 ) func main() { s : 你好世界 // 获取字节长度 byteLength : len(s) fmt.Println(Byte length:, byteLength) // 获取字符数量 charCount : utf8.RuneCountInString(s) fmt.Println(Character count:, charCount) // 遍历字符 for i, r : range s { fmt.Printf(Index %d: %c\n, i, r) } }8.2 URL编码和解码package main import ( fmt net/url ) func main() { s : Hello, World! // URL编码 encoded : url.QueryEscape(s) fmt.Println(URL encoded:, encoded) // URL解码 decoded, err : url.QueryUnescape(encoded) if err ! nil { fmt.Println(Error decoding:, err) return } fmt.Println(URL decoded:, decoded) }9. 字符串的格式化package main import fmt func main() { // 基本格式化 s1 : fmt.Sprintf(Hello, %s!, World) fmt.Println(s1) // 数字格式化 s2 : fmt.Sprintf(Pi is approximately %.2f, 3.14159) fmt.Println(s2) // 整数格式化 s3 : fmt.Sprintf(The answer is %d, 42) fmt.Println(s3) // 布尔值格式化 s4 : fmt.Sprintf(Is it true? %t, true) fmt.Println(s4) }10. 实战案例10.1 实现一个简单的字符串反转package main import fmt func reverseString(s string) string { runes : []rune(s) for i, j : 0, len(runes)-1; i j; i, j i1, j-1 { runes[i], runes[j] runes[j], runes[i] } return string(runes) } func main() { s : Hello, World! reversed : reverseString(s) fmt.Println(Original:, s) fmt.Println(Reversed:, reversed) }10.2 实现一个简单的单词计数器package main import ( fmt strings ) func countWords(s string) map[string]int { words : strings.Fields(s) counts : make(map[string]int) for _, word : range words { // 转换为小写以忽略大小写 word strings.ToLower(word) // 移除标点符号 word strings.Trim(word, ,.!?;:()[]{}\) if word ! { counts[word] } } return counts } func main() { s : Hello, World! Hello, Go! counts : countWords(s) for word, count : range counts { fmt.Printf(%s: %d\n, word, count) } }10.3 实现一个简单的字符串模板package main import ( fmt strings ) func renderTemplate(template string, data map[string]string) string { result : template for key, value : range data { placeholder : {{ key }} result strings.ReplaceAll(result, placeholder, value) } return result } func main() { template : Hello, {{name}}! You are {{age}} years old. data : map[string]string{ name: John, age: 30, } result : renderTemplate(template, data) fmt.Println(result) }11. 字符串处理的最佳实践11.1 性能优化对于频繁的字符串拼接使用strings.Builder对于大量的字符串操作考虑使用[]byte避免在循环中创建临时字符串11.2 编码处理注意UTF-8编码的字符处理使用rune类型处理Unicode字符避免使用byte操作处理包含非ASCII字符的字符串11.3 安全性注意字符串注入攻击正确处理用户输入的字符串避免使用不安全的字符串操作函数12. 总结Go语言提供了丰富的字符串处理功能通过标准库中的strings包和其他相关包我们可以方便地进行各种字符串操作。本文介绍了Go语言字符串处理的基础知识包括字符串的创建、长度计算、拼接、比较、搜索和替换、分割和连接、大小写转换、修剪、编码和解码、格式化以及实战案例等方面的内容。在实际开发中我们应该根据具体的需求选择合适的字符串处理方法并且注意性能优化和编码处理。通过合理的字符串处理我们可以编写更加高效、可靠的代码。希望本文对你理解和应用Go语言的字符串处理有所帮助祝你在Go语言的道路上越走越远

更多文章