mirror of
https://github.com/Estom/notes.git
synced 2026-02-09 13:27:09 +08:00
136 lines
4.9 KiB
Go
136 lines
4.9 KiB
Go
// strings 包使用示例
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"strings"
|
||
)
|
||
|
||
func main() {
|
||
|
||
//
|
||
// 包含与判断
|
||
//
|
||
fmt.Println(strings.Contains("mix", "")) // true // "mix" 认为包含 "" 空串
|
||
fmt.Println(strings.ContainsAny("mix", "xml")) // true // 'x'
|
||
fmt.Println(strings.ContainsRune("吴胤", '胤')) // true
|
||
fmt.Println(strings.HasPrefix("err: failed", "err:")) // true
|
||
fmt.Println(strings.HasSuffix("err: failed", "fail")) // false
|
||
fmt.Println(strings.EqualFold("Go", "go")) // true // 转为全小写检查 UTF8 编码的底层 Unicode 是否一致
|
||
|
||
//
|
||
// 计数与索引
|
||
//
|
||
fmt.Println(strings.Count("hello", "l")) // 2
|
||
fmt.Println(strings.Count("hello", "")) // 6
|
||
fmt.Println(strings.Index("winner", "in")) // 1
|
||
fmt.Println(strings.Index("winner", "f")) // -1 // 不存在返回 -1
|
||
fmt.Println(strings.IndexAny("winner", "air")) // 1
|
||
fmt.Println(strings.IndexRune("winner", 'r')) // 5
|
||
fmt.Println(strings.LastIndex("winner", "i")) // 1
|
||
fmt.Println(strings.LastIndexAny("winner", "min")) // 3
|
||
// 遍历返回符合 index 的 rune 位置
|
||
index := func(r rune) bool {
|
||
if r > 'b' {
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
fmt.Println(strings.IndexFunc("abcd", index)) // 2 // c
|
||
fmt.Println(strings.LastIndexFunc("abcda", index)) // 3 // d
|
||
|
||
//
|
||
// 连接与切割
|
||
//
|
||
fmt.Println("ba" + strings.Repeat("na", 2)) // banana
|
||
fmt.Println(strings.Join([]string{"hello", "world", "!"}, "-")) // hello-world-!
|
||
fmt.Printf("%q\n", strings.Split("a,b,c", "")) // ["a" "," "b" "," "c"]
|
||
fmt.Printf("%q\n", strings.Split("a,b,c", ",")) // ["a" "b" "c"]
|
||
fmt.Printf("%q\n", strings.SplitN("a,b,c", ",", 2)) // ["a" "b,c"] // 最多保留 2 个子串,前 2-1 个是分割后的有效子串
|
||
fmt.Printf("%q\n", strings.SplitAfter("a,b,c", ",")) // ["a," "b," "c"] // 保留 sep 切割字符
|
||
fmt.Printf("%q\n", strings.SplitAfterN("a,b,c", ",", 2)) // ["a," "b,c"]
|
||
fmt.Printf("%q\n", strings.Fields("I am best")) // ["I" "am" "best"] // 按空格分割字符串
|
||
// 自定义分割字符串的逻辑函数
|
||
// 遍历参数字符串的每个字符,若符合 split 逻辑则按该字符分割,且该字符保留
|
||
split := func(r rune) bool {
|
||
if r > 'b' {
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
fmt.Printf("%q\n", strings.FieldsFunc("vavbve", split)) // ["a" "b"]
|
||
|
||
//
|
||
// 大小写处理
|
||
//
|
||
fmt.Println(strings.Title("hello")) // Hello
|
||
fmt.Println(strings.ToLower("HellO")) // hello
|
||
fmt.Println(strings.ToTitle("dz")) // Dz
|
||
fmt.Println(strings.ToUpper("dz")) // DZ // 某些特殊的 Unicode 字符并不一致
|
||
|
||
//
|
||
// trim 处理
|
||
//
|
||
// 将 string 开头和结尾包含字符集的字符全部过滤掉
|
||
fmt.Println(strings.Trim("anhellok ", "ak ")) // nhello
|
||
fmt.Println(strings.TrimLeft("anhellok ", "ak ")) // nhellok
|
||
fmt.Println(strings.TrimRight("anhellok ", "ak ")) // anhello
|
||
// trim 所有大写字母 // A:65, a:97
|
||
trimF := func(r rune) bool {
|
||
if r < 'Z' {
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
fmt.Println(strings.TrimFunc("HellO", trimF)) // ell
|
||
fmt.Println(strings.TrimLeftFunc("HellO", trimF)) // ellO
|
||
fmt.Println(strings.TrimRightFunc("HellO", trimF)) // Hell
|
||
fmt.Printf("%q\n", strings.TrimSpace(" \t TLV \n\r")) // "TLV"
|
||
|
||
//
|
||
// 遍历与替换
|
||
//
|
||
mapRune := func(r rune) rune {
|
||
return r + 1 // return r + math.MaxInt32 // 处理不正确会丢弃该字符
|
||
}
|
||
fmt.Println(strings.Map(mapRune, "abc吴")) // bcd吵
|
||
rp := strings.NewReplacer("x", "X", "y", "Y") // 配对出现的旧-新字符串
|
||
fmt.Println(rp.Replace("six year")) // siX Year
|
||
rp.WriteString(os.Stdout, "six year\n") // siX Year 将替换后的字符串输出 Writer
|
||
fmt.Println(strings.Replace("wow what", "w", "W", 2)) // WoW what // n<0 则全部替换
|
||
|
||
//
|
||
// Reader 相关
|
||
//
|
||
rStr := "wuYin吴" // [119 117 89 105 110 229 144 180]
|
||
r := strings.NewReader(rStr)
|
||
|
||
// reader 中未读取的字符串长度
|
||
fmt.Println(r.Len()) // 8(5+3)
|
||
b := make([]byte, 2)
|
||
|
||
// 从 reader 中读取全部字符串到 b 中,返回实际读取的字节数 n 和错误 err
|
||
n, err := r.Read(b)
|
||
fmt.Println(err, n, b) // nil 2 [119 117] // rStr = "" 则出错 EOF
|
||
|
||
// 从指定的 offset 位置开始读取内容到 b
|
||
// offset < 0 || offset > (len(rStr) - len(b)) 则报错 EOF
|
||
n, err = r.ReadAt(b, 3)
|
||
fmt.Println(err, n, b) // nil 2 [105 110]
|
||
|
||
oneByte, err := r.ReadByte()
|
||
fmt.Println(err, oneByte) // nil 89 // 此时 reader 中的数据 0,1,3,4 的数据都已被读取
|
||
|
||
oneRune, size, err := r.ReadRune()
|
||
fmt.Println(err, oneRune, size) // nil 105 1
|
||
|
||
r.Seek(2, 1) // 将 seeker 向后挪 2 位
|
||
oneByte, err = r.ReadByte()
|
||
fmt.Println(err, oneByte) // nil 144
|
||
|
||
r.UnreadByte() // seeker 从 180 回滚到 114
|
||
oneByte, err = r.ReadByte()
|
||
fmt.Println(err, oneByte) // nil 144
|
||
}
|