当前位置: 首页 > news >正文

【Go】--strings包

文章目录

  • Go 语言 strings 包常用方法详解
    • 1. 字符串判断与查询
      • Contains - 检查包含关系
      • 前缀/后缀判断
      • 字符位置查找
    • 2. 字符串计数与比较
      • Count - 统计出现次数
      • Compare - 字符串比较
      • EqualFold - 不区分大小写比较
    • 3. 字符串变换
      • 大小写转换
      • 修剪操作
      • 替换操作
    • 4. 字符串分割与连接
      • 分割操作
      • 连接操作
    • 5. 重复与填充
      • Repeat - 重复字符串
    • 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() {// Contains 检查字符串是否包含子串fmt.Println(strings.Contains("hello world", "hello")) // truefmt.Println(strings.Contains("hello world", "foo"))   // false// ContainsAny 检查是否包含任何指定字符fmt.Println(strings.ContainsAny("hello", "aeiou")) // truefmt.Println(strings.ContainsAny("hello", "xyz"))   // false// ContainsRune 检查是否包含特定 Unicode 字符fmt.Println(strings.ContainsRune("hello", 'h')) // truefmt.Println(strings.ContainsRune("hello", 'z')) // false
}

前缀/后缀判断

func prefixSuffixDemo() {s := "hello world"// HasPrefix 检查前缀fmt.Println(strings.HasPrefix(s, "hello")) // truefmt.Println(strings.HasPrefix(s, "world")) // false// HasSuffix 检查后缀fmt.Println(strings.HasSuffix(s, "world")) // truefmt.Println(strings.HasSuffix(s, "hello")) // false
}

字符位置查找

func searchDemo() {s := "hello world, hello go"// Index 查找子串第一次出现位置fmt.Println(strings.Index(s, "world"))     // 6fmt.Println(strings.Index(s, "python"))    // -1// LastIndex 查找子串最后一次出现位置fmt.Println(strings.LastIndex(s, "hello")) // 13// IndexAny 查找任何指定字符第一次出现位置fmt.Println(strings.IndexAny(s, "aeiou"))  // 1 (e的位置)// IndexRune 查找 Unicode 字符位置fmt.Println(strings.IndexRune(s, '世'))    // -1// LastIndexAny 查找任何指定字符最后一次出现位置fmt.Println(strings.LastIndexAny(s, "aeiou")) // 16 (o的位置)
}

2. 字符串计数与比较

Count - 统计出现次数

func countDemo() {s := "banana"// Count 统计子串出现次数fmt.Println(strings.Count(s, "a"))     // 3fmt.Println(strings.Count(s, "an"))    // 2fmt.Println(strings.Count(s, "ana"))   // 1fmt.Println(strings.Count("five", "")) // 5 (注意空串的情况)
}

Compare - 字符串比较

func compareDemo() {// Compare 按字典序比较两个字符串// 返回: //   -1 如果 a < b//    0 如果 a == b//    1 如果 a > bfmt.Println(strings.Compare("apple", "banana")) // -1fmt.Println(strings.Compare("apple", "apple"))  // 0fmt.Println(strings.Compare("banana", "apple")) // 1// 通常更推荐直接使用比较运算符fmt.Println("apple" < "banana") // truefmt.Println("apple" == "apple") // true
}

EqualFold - 不区分大小写比较

func equalFoldDemo() {// EqualFold 不区分大小写比较fmt.Println(strings.EqualFold("Go", "go"))     // truefmt.Println(strings.EqualFold("Hello", "HELLO")) // truefmt.Println(strings.EqualFold("Go", "Python")) // false
}

3. 字符串变换

大小写转换

func caseDemo() {s := "Hello World"// ToUpper 转换为大写fmt.Println(strings.ToUpper(s)) // "HELLO WORLD"// ToLower 转换为小写fmt.Println(strings.ToLower(s)) // "hello world"// Title 已废弃,使用 ToTitlefmt.Println(strings.ToTitle(s)) // "HELLO WORLD"// 特殊的大小写处理fmt.Println(strings.ToUpperSpecial(unicode.TurkishCase, "ı")) // "I"
}

修剪操作

func trimDemo() {s := "   hello world   "// TrimSpace 去除前后空白字符fmt.Printf("'%s'\n", strings.TrimSpace(s)) // 'hello world'// Trim 去除指定字符fmt.Println(strings.Trim("!!!hello!!!", "!")) // "hello"// TrimLeft 去除左侧指定字符fmt.Println(strings.TrimLeft("!!!hello!!!", "!")) // "hello!!!"// TrimRight 去除右侧指定字符fmt.Println(strings.TrimRight("!!!hello!!!", "!")) // "!!!hello"// TrimPrefix 去除前缀fmt.Println(strings.TrimPrefix("hello world", "hello ")) // "world"// TrimSuffix 去除后缀fmt.Println(strings.TrimSuffix("hello world", " world")) // "hello"// 使用 TrimFunc 自定义修剪规则result := strings.TrimFunc("123hello456", func(r rune) bool {return r >= '0' && r <= '9'})fmt.Println(result) // "hello"
}

替换操作

func replaceDemo() {s := "hello world, hello go"// Replace 替换字符串// 参数:原字符串,旧子串,新子串,替换次数(-1表示全部替换)fmt.Println(strings.Replace(s, "hello", "hi", 1))  // "hi world, hello go"fmt.Println(strings.Replace(s, "hello", "hi", -1)) // "hi world, hi go"// ReplaceAll 替换所有(Go 1.12+)fmt.Println(strings.ReplaceAll(s, "hello", "hi")) // "hi world, hi go"// Map 使用函数进行字符替换result := strings.Map(func(r rune) rune {if r == 'o' {return '0' // 将 o 替换为 0}return r}, "hello world")fmt.Println(result) // "hell0 w0rld"
}

4. 字符串分割与连接

分割操作

func splitDemo() {s := "apple,banana,orange"// Split 分割字符串parts := strings.Split(s, ",")fmt.Printf("%#v\n", parts) // []string{"apple", "banana", "orange"}// SplitN 限制分割次数partsN := strings.SplitN(s, ",", 2)fmt.Printf("%#v\n", partsN) // []string{"apple", "banana,orange"}// SplitAfter 分割但保留分隔符partsAfter := strings.SplitAfter(s, ",")fmt.Printf("%#v\n", partsAfter) // []string{"apple,", "banana,", "orange"}// Fields 按空白字符分割fields := strings.Fields("  hello   world\tgo\nlang  ")fmt.Printf("%#v\n", fields) // []string{"hello", "world", "go", "lang"}// FieldsFunc 使用自定义函数分割fieldsFunc := strings.FieldsFunc("apple,banana;orange", func(r rune) bool {return r == ',' || r == ';'})fmt.Printf("%#v\n", fieldsFunc) // []string{"apple", "banana", "orange"}
}

连接操作

func joinDemo() {// Join 连接字符串切片fruits := []string{"apple", "banana", "orange"}result := strings.Join(fruits, ", ")fmt.Println(result) // "apple, banana, orange"// 复杂连接示例words := []string{"hello", "world", "go"}fmt.Println(strings.Join(words, "::")) // "hello::world::go"
}

5. 重复与填充

Repeat - 重复字符串

func repeatDemo() {// Repeat 重复字符串fmt.Println(strings.Repeat("go", 3))    // "gogogo"fmt.Println(strings.Repeat("-", 10))    // "----------"fmt.Println(strings.Repeat("hello ", 2)) // "hello hello "
}

6. 字符串遍历与处理

字符遍历

func rangeDemo() {s := "hello世界"// 使用 range 遍历字符串(正确处理 Unicode)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() {// 1. 清理用户输入userInput := "  Hello, World!  "cleaned := strings.TrimSpace(userInput)fmt.Printf("清理后: '%s'\n", cleaned)// 2. 检查文件扩展名filename := "document.pdf"if strings.HasSuffix(strings.ToLower(filename), ".pdf") {fmt.Println("这是一个PDF文件")}// 3. 分割CSV数据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)}// 4. 构建URL路径baseURL := "https://api.example.com"endpoints := []string{"users", "123", "profile"}fullURL := baseURL + "/" + strings.Join(endpoints, "/")fmt.Printf("完整URL: %s\n", fullURL)// 5. 密码强度检查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() {// 对于大量字符串拼接,使用 Builder 更高效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) // "Alice, Bob, Charlie"// 重置 Builder 重用builder.Reset()builder.WriteString("重新开始")fmt.Println(builder.String()) // "重新开始"
}

8. 重要注意事项

  1. 字符串不可变:所有操作都返回新字符串
  2. Unicode 安全:大多数函数正确处理 Unicode 字符
  3. 性能考虑:大量字符串操作时考虑使用 strings.Builder
  4. 空字符串处理:注意空字符串和 nil 的区别
func importantNotes() {// 空字符串 vs nilvar s1 string        // 零值是空字符串 ""var s2 *string       // 指针,零值是 nilfmt.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)
}
http://www.dtcms.com/a/471176.html

相关文章:

  • 【AI课程上线了哦,打造类FastGPT产品】
  • 织梦网站修改幻灯片怎么看公司网站建设的时间
  • 陕西省住房城乡建设厅网站管理中心wordpress5导航图标
  • Adobe Analytics 实践指南:提升营销效果
  • 网站后台卸载cmsdede一 网站建设方案
  • python学习:爬虫+项目测试
  • 如何使用Prosys OPC UA SDK for Java在 Android 上开发 OPC UA 应用程序?
  • 网站制作软件排行榜网站开发结构有
  • 重庆公司网站建设步骤优化大师有必要安装吗
  • 医院网站建设报价网站更换ip地址
  • 大学网站建设的目标与思路珍爱网建设网站的目的
  • 网站规划的注意事项网络推广网站首页大图
  • 陕西省住房和城乡建设部网站官网建晨网站建设
  • 核辐射检测仪中的抗辐照MCU芯片应用探索与挑战应对
  • 无人机中继通信链路技术要点分析
  • 2025年ASOC SCI2区TOP,基于两种平衡机制的异构无人机群路径规划多目标进化算法,深度解析+性能实测,深度解析+性能实测
  • STM32CubeMX + HAL 库:定时器输入捕获的应用,PWM波的占空比(频率/周期)测量
  • 【解决】OSError: We couldn‘t connect to ‘https://huggingface.co‘ to load this file
  • 湖北营销网站建设联系方式装修估价网
  • 数据库系列之:SQL Server 事务日志
  • UE5 在运行状态下,可以显示出移动,旋转,缩放轴的功能基础上,新增框选,以及打组解组和从组中单独移除某一个actor的功能
  • 凡科网做网站教程家居装修设计平台
  • 网站后台页面进不去做外贸的有些什么网站
  • 学校网站功能python购物网站开发流程
  • 大数据成矿预测系列(四) | 成矿预测的“主力军”:随机森林与支持向量机深度解析
  • 企业网站优化费用iis 网站后台
  • 工业可视化监控平台GENESIS64核心能力与架构解析
  • 网站建设公司位置广东做网站的公司有哪些
  • 石家庄科技网站建设ppt制作平台
  • 如何自建网站做淘客常州网站专业制作