文章目录
简介
bytes包提供了对字节切片进行读写操作的一系列函数,字节切片处理的函数比较多分为基本处理函数、比较函数、后缀检查函数、索引函数、分割函数、大小写处理函数和子切片处理函数等。
对于传入
[]byte参数(引用类型,函数中修改会改变外部变量)
的函数,都不会修改传入的参数,返回值要么是参数的副本,要么是参数的切片。(深入函数可以看到大多数函数内部会创建新的字节切片对象,并返回)
一 相关函数
1.1 转换
函数 | 说明 |
---|---|
func ToUpper(s []byte) []byte |
将 s 中的所有字符修改为大写格式返回。 |
func ToLower(s []byte) []byte |
将 s 中的所有字符修改为小写格式返回 |
func ToTitle(s []byte) []byte |
将 s 中的所有字符修改为标题格式返回 |
func ToUpperSpecial(_case unicode.SpecialCase, s []byte) []byte |
使用指定的映射表将 s 中的所有字符修改为大写格式返回。 |
func ToLowerSpecial(_case unicode.SpecialCase, s []byte) []byte |
使用指定的映射表将 s 中的所有字符修改为小写格式返回。 |
func ToTitleSpecial(_case unicode.SpecialCase, s []byte) []byte |
使用指定的映射表将 s 中的所有字符修改为标题格式返回。 |
func Title(s []byte) []byte |
将 s 中的所有单词的首字符修改为 Title 格式返回。(缺点:不能很好的处理以 Unicode 标点符号分隔的单词。) |
实例演示:
package main
import (
"bytes"
"fmt"
)
func main() {
var b = []byte("seafood") //强制类型转换
a := bytes.ToUpper(b)
fmt.Println(a, b)
c := b[0:4]
c[0] = 'A'
fmt.Println(c, b)
}
运行结果:
[Running] go run "c:\Users\Mechrevo\Desktop\go_pro\test.go"
[83 69 65 70 79 79 68] [115 101 97 102 111 111 100]
[65 101 97 102] [65 101 97 102 111 111 100]
[Done] exited with code=0 in 1.023 seconds
可以看出函数不会修改原引用值类型。
1.2 比较
函数 | 说明 |
---|---|
func Compare(a, b []byte) int |
比较两个 []byte,nil 参数相当于空 []byte。a < b 返回 -1;a == b 返回 0;a > b 返回 1 |
func Equal(a, b []byte) bool |
判断 a、b 是否相等,nil 参数相当于空 []byte。 |
func EqualFold(s, t []byte) bool |
判断 s、t 是否相似,忽略大写、小写、标题三种格式的区别。 |
实例演示:
package main
import (
"bytes"
"fmt"
)
func main() {
s1 := "Φφϕ kKK"
s2 := "ϕΦφ KkK"
// 看看 s1 里面是什么
for _, c := range s1 {
fmt.Printf("%-5x", c)
}
fmt.Println()
// 看看 s2 里面是什么
for _, c := range s2 {
fmt.Printf("%-5x", c)
}
fmt.Println()
// 看看 s1 和 s2 是否相似
fmt.Println(bytes.EqualFold([]byte(s1), []byte(s2)))
}
运行结果:
[Running] go run "c:\Users\Mechrevo\Desktop\go_pro\test.go"
3a6 3c6 3d5 20 6b 4b 212a
3d5 3a6 3c6 20 212a 6b 4b
true
[Done] exited with code=0 in 0.978 seconds
1.3 清理
函数 | 说明 |
---|---|
func Trim(s []byte, cutset string) []byte |
去掉 s 两边包含在 cutset 中的字符(返回 s 的切片 |
func TrimLeft(s []byte, cutset string) []byte |
去掉 s 左边包含在 cutset 中的字符(返回 s 的切片) |
func TrimRight(s []byte, cutset string) []byte |
去掉 s 右边包含在 cutset 中的字符(返回 s 的切片) |
func TrimFunc(s []byte, f func(r rune) bool) []byte |
去掉 s 两边符合 f函数====返回值是true还是false 要求的字符(返回 s 的切片) |
func TrimLeftFunc(s []byte, f func(r rune) bool) []byte |
去掉 s左边符合 f函数====返回值是true还是false 要求的字符(返回 s 的切片) |
func TrimRightFunc(s []byte, f func(r rune) bool) []byte |
去掉 s右边符合 f函数====返回值是true还是false 要求的字符(返回 s 的切片) |
func TrimSpace(s []byte) []byte |
去掉 s 两边的空白(unicode.IsSpace)(返回 s 的切片) |
func TrimPrefix(s, prefix []byte) []byte |
去掉 s 的前缀 prefix(返回 s 的切片) |
func TrimSuffix(s, suffix []byte) []byte |
去掉 s 的后缀 suffix(返回 s 的切片) |
实例演示:
package main
import (
"bytes"
"fmt"
)
func main() {
bs := [][]byte{
//[][]byte 字节切片 二维数组
[]byte("Hello World !"),
[]byte("Hello 世界!"),
[]byte("hello golang ."),
}
f := func(r rune) bool {
return bytes.ContainsRune([]byte("!!. "), r) //判断r字符是否包含在"!!. "内
}
for _, b := range bs {
//range bs 取得下标和[]byte
fmt.Printf("去掉两边: %q\n", bytes.TrimFunc(b, f)) //去掉两边满足函数的字符
}
for _, b := range bs {
fmt.Printf("去掉前缀: %q\n", bytes.TrimPrefix(b, []byte("Hello "))) //去掉前缀
}
}
运行结果: