[TOC]
包 strings 实现了简单的函数来操作 UTF-8 编码的字符串。
# 函数
## Contains
变量s 包含有 变量substr 字符串。
```go
str := " kef ls jfelsewfe"
fmt.Println(strings.Contains(str, "ls"))
fmt.Println(strings.Contains(str, "lsfe"))
// 运行结果
// true
// false
```
## Count
统计 变量substr 出现在 变量s 几次
```go
str := " kef ls jfelsewfe"
fmt.Println(strings.Count(str, "ls"))
// 运行结果
// 2
```
## Cut
根据字符串sep来分割字符串s,返回分割前半段,分割后半段,是否分割
```go
str := " kef ls jfelsewfe"
b, a, ok := strings.Cut(str, "ls")
if ok {
fmt.Printf("before is %#v, after is %#v\n", b, a)
} else {
fmt.Println("sep not found.")
}
// 运行结果
// before is " kef ", after is " jfelsewfe"
```
## HasPrefix、HasSuffix
根据字符串prefix来判断是否字符串s开头或结尾
```go
str := " kef ls jfelsewfe"
fmt.Println(strings.HasPrefix(str, "kef"))
fmt.Println(strings.HasPrefix(str, " kef"))
fmt.Println(strings.HasSuffix(str, "ewfe"))
// 运行结果
// false
// true
// true
```
## Index
判断匹配字符第一次出现str的索引。未匹配到则返回-1
```go
str = "jewpw wef ce"
// 返回第一次匹配到的索引(匹配整个字符)
fmt.Println(strings.Index(str, "ls"))
// 返回第一次匹配到的索引(任一个字符)
fmt.Println(strings.IndexAny(str, "wef"))
// 运行结果
// -1
// 1
```
## LastIndex
判断匹配字符最后一次出现str的索引。未匹配到则返回-1
```go
str = "jewpw wef cweoes"
fmt.Println(strings.LastIndex(str, "we"))
fmt.Println(strings.LastIndexAny(str, "we"))
// 运行结果
// 11
// 14
```
## Join
字符串切片,切片中每个元素使用 sep 连接
```go
strSlice := []string{"jiax", "zeng"}
fmt.Println(strings.Join(strSlice, "_"))
// 运行结果
// jiax_zeng
```
## Replace
替换字符串
```go
str = "jewpw wef cweoes"
// 将字符串s匹配old的字符串,替换成new的字符串。替换次数
// 替换次数为 -1 ,则说明替换所有old匹配成功的字符串
fmt.Println(strings.Replace(str, "we", "xe", 1))
fmt.Println(strings.Replace(str, "we", "xe", -1))
// 将字符串s匹配old的字符串,替换成new的字符串(所有匹配成功)
fmt.Println(strings.ReplaceAll(str, "we", "xe"))
// 运行结果
// jewpw xef cweoes
// jewpw xef cxeoes
// jewpw xef cxeoes
```
## Split
分割字符串
```go
str = "jiax_zeng_lin"
// 根据分隔符sep来分割str数据(所有匹配成功都分割)
fmt.Printf("%#v\n", strings.Split(str, "_"))
// 根据分隔符sep来分割str数据,n是返回几个切片元素
// 是从前面开始分割的,-1 是分割所有匹配成功的
fmt.Printf("%#v\n", strings.SplitN(str, "_", 2))
fmt.Printf("%#v\n", strings.SplitN(str, "_", -1))
// 根据分隔符sep来分割str数据(所有匹配成功都分割),返回字符串切片包含分割符号
fmt.Printf("%#v\n", strings.SplitAfter(str, "_"))
// 根据分隔符sep来分割str数据,n是返回几个切片元素
// 是从前面开始分割的,-1 是分割所有匹配成功的
// 返回字符串切片包含分割符号
fmt.Printf("%#v\n", strings.SplitAfterN(str, "_", 2))
fmt.Printf("%#v\n", strings.SplitAfterN(str, "_", -1))
// 运行结果
// []string{"jiax", "zeng", "lin"}
// []string{"jiax", "zeng_lin"}
// []string{"jiax", "zeng", "lin"}
// []string{"jiax_", "zeng_", "lin"}
// []string{"jiax_", "zeng_lin"}
// []string{"jiax_", "zeng_", "lin"}
```
## Title
将单词首字母大写
```go
str = "i love china"
fmt.Println(strings.Title(str))
// 运行结果
// I Love China
```
## ToLower、ToUpper
将字符串转换成大小写
```go
str = "my name is jiaxzeng, i love China."
fmt.Println(strings.ToLower(str))
fmt.Println(strings.ToUpper(str))
// 运行结果
// my name is jiaxzeng, i love china.
// MY NAME IS JIAXZENG, I LOVE CHINA.
```
## Trim
切割字符串
```go
str = " jewpw wef cweoes "
// 切割前后的字符串
fmt.Printf("%#v\n", strings.Trim(str, " "))
// 切割前后的空格、tab键、换行符
fmt.Printf("%#v\n", strings.TrimSpace(str))
// 切割前缀的字符串
fmt.Printf("%#v\n", strings.TrimPrefix(str, " "))
// 切割结尾的字符串
fmt.Printf("%#v\n", strings.TrimSuffix(str, " "))
// 运行结果
// "\tjewpw wef cweoes"
// "jewpw wef cweoes"
// "\tjewpw wef cweoes "
// " \tjewpw wef cweoes"
```
# Reader 结构体
Reader 通过读取字符串来实现 io.Reader、io.ReaderAt、io.ByteReader、io.ByteScanner、io.RuneReader、io.RuneScanner、io.Seeker 和 io.WriterTo 接口。 Reader 的零值的操作类似于空字符串的 Reader。
## NewReader
NewReader 返回一个从 s 读取的新 Reader。 它类似于 bytes.NewBufferString 但更高效且只读。
```go
reader := strings.NewReader("jiaxzeng")
fmt.Printf("type: %T\n", reader)
// 运行结果
// type: *strings.Reader
```
## Len
Len 返回字符串未读部分的字节数。
```go
reader := strings.NewReader("jiaxzeng")
fmt.Println(reader.Len())
// 运行结果
// 8
```
## Size
Size 返回基础字符串的原始长度。
```go
reader := strings.NewReader("jiaxzeng")
fmt.Println(reader.Size())
// 运行结果
// 8
```
## Read
Read 读取 reader 的内容
```go
reader := strings.NewReader("jiaxzeng")
buf := make([]byte, 4)
for {
n, err := reader.Read(buf)
if err == io.EOF {
break
}
fmt.Printf("read context: %v\n", string(buf[:n]))
}
// 运行结果
// read context: jiax
// read context: zeng
```
官网文档:https://pkg.go.dev/strings@go1.18.10
- Golang简介
- 开发环境
- Golang安装
- 编辑器及快捷键
- vscode插件
- 第一个程序
- 基础数据类型
- 变量及匿名变量
- 常量与iota
- 整型与浮点型
- 复数与布尔值
- 字符串
- 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 流程控制语句
- 获取用户输入
- if分支语句
- for循环语句
- switch语句
- break_continue_goto语法
- 高阶数据类型
- pointer指针
- array数组
- slice切片
- slice切片扩展
- map映射
- 函数
- 函数定义和调用
- 函数参数
- 函数返回值
- 作用域
- 函数形参传递
- 匿名函数
- 高阶函数
- 闭包
- defer语句
- 内置函数
- fmt
- strconv
- strings
- time
- os
- io
- 文件操作
- 编码
- 字符与字节
- 字符串
- 读写文件
- 结构体
- 类型别名和自定义类型
- 结构体声明
- 结构体实例化
- 模拟构造函数
- 方法接收器
- 匿名字段
- 嵌套与继承
- 序列化
- 接口
- 接口类型
- 值接收者和指针接收者
- 类型与接口对应关系
- 空接口
- 接口值
- 类型断言
- 并发编程
- 基本概念
- goroutine
- channel
- select
- 并发安全
- 练习题
- 第三方库
- Survey
- cobra