[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