Go语言学习笔记—golang标准库bytes包

本文详细介绍了Go语言标准库bytes包的使用,包括转换、比较、清理、拆合、字符串操作、替换等基本函数,以及Buffer类型的声明、写入、读取等方法,并通过实例演示了每个功能的应用。
摘要由CSDN通过智能技术生成


简介

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 "))) //去掉前缀
	}
}

运行结果:

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值