GO标准库 bytes标准库

对字节切片的工具包

常用函数

转换

func ToUpper(s []byte) []byte //将s中所有的字符转为大写格式
func ToLower(s []byte) []byte //将s中所有的字符转为小写格式

比较

按照ASCLL码,大写大于小写
A=65
0=48
a=97

func Compare(a,b []byte) int //比较两个[]byte,a<b返回-1;a==b返回0;a>b返回1
func Equal(a,b []byte) bool //判断是否相等,nil相当于空[]byte
func EqualFold(a,b []byte) bool //判断是否相等,忽略大小写和标题格式

拆合

func Split(s sep []byte) [][]byte 
//以sep为分隔符切分s为多个字串,结果不包含分隔符。若不包含sep则s被切分为Unicode字符列表
func SplitN(s sep []byte,n int) [][]byte 
//指定切分n次,超出n的部分将不切分
func SplitAfter(s sep []byte) []byte 
//同Split但包含分隔符(在各个字串尾部)
func SplitAfterN(s sep []byte) []byte 
//同SplitN但包含分隔符(在各个字串尾部)
func Fields(s []byte) [][]byte
//以连续空白切分s为多个字串,结果不包含分隔符,即["h  s a"]分割为[h][s][a]
func FieldsFunc(s []byte ,f func(rune)bool) [][]byte
//以符合f字符为分割符切分s,结尾不包含分隔符
func Join(s [][]byte, sep []byte)[]byte
//以sep为连接符将s字串连在一起
func Repeat(b []byte, count int) []byte
//b重复count次返回

字串

func HasPrefix(s, prefix []byte)bool
//判断s是否有前缀prefix
func HasSufix(s, suffix []byte)bool
//判断s是否有前缀suffix 
func ContainsRune(b []byte, r rune)bool
//判断b是否包含子串/字符 r
func ContainsAny(b []byte, chars string)bool
//判断b中是否包含chars中的任一字符
func Index(s seq []byte) int
//查找子串seq在s中第一次出现的位置,找不到则返回-1
func IndexByet(s []byte, c byte)int
//查找子串 字符c在s中第一次出现的位置,找不到则返回-1
func Index(s []byte, f func(r rune) bool)int
//查找符合f的字符在s中第一次出现的位置,找不到则返回-1
func Count(s,sep []byte)int
//获取sep在s中出现的次数(sep不能重叠)

替换

func Replace(s, old, new []byte,n int) []byte
//将s中前n个old替换为new,n<0则替换全部
func Map(mapping func(r rune) rune, s []byte)[]byte
//将s中的字符全部替换为mapping的返回值,若mapping返回负值则丢弃该字符
func Runes(s []byte) []rune
//将s转为[]rune返回

Buffer类型

具有读取和写入方法的可变大小的字节缓冲区
Buffer的零值是准备使用的空缓冲区

声明

##写数据

在这里插入图片描述
在这里插入图片描述

其他方法

在这里插入图片描述
Next和Read类似,但是没有指定buf。
在这里插入图片描述在这里插入图片描述

Reader类型



补充

func Read(p []byte) (n int, err error)
//设置偏移量,他有2个参数,第一个是偏移多少个字节,第二个参数是从哪里开始偏移。
//Read 读数据的时候只需要给一个 buffer 就行了,偏移在内部维护
func ReadAt(p []byte, off int64) (n int, err error)
//从偏移量开始读取,传入参数是两个,
//一个 ( 装读到的数据 buffer ),off(读取的偏移位置),
//返回值 n(标示读到了多少数据),err(错误码);
//ReadAt 可以让你从指定的位置读数据,偏移自维护

关于Read和ReadAt的区别

Read 读数据的时候只需要给一个 buffer 就行了,偏移在内部维护,ReadAt 可以让你从指定的位置读数据,偏移自维护。这个是两个接口的最明显的区别。
但除此之外还有一个问题
Golang 里面 Read 接口对于读的结果有这么几种情况:

  1. 读成功了,数据完全填充 buffer ,读到了用户预期的数据大小,这个时候 n == len(p),err == nil,p里都是用户有用的数据;
  2. 读失败了,err != nil ,这个时候 err 会标示出对应的错误;
  3. 读到 EOF 了,err ==EOF,n 标示读到的有用数据大小,p 部分被填充;
  4. 第四种最坑(最细节),这个也是 Read 特意说明的(我截屏标红的),golang 允许当数据还没全部准备好的时候,返回部分数据,这个时候 err == nil;

也就是说,Read接口允许:没有读满预期的 buffer,也不是 EOF 的情况,err == nil,这种情况是 Golang Read接口语义的一部分;

ReadAt 接口,Golang 的 interface 也特意说明了,这个接口比 Read 更严格,不允许第四种情况的发生。也就是说,ReadAt 读数据的结果,只有三种:

  1. 那么就是读成功,读满 buffer,这个时候 n == len(p),err == nil。
  2. 要们就是读到 EOF,这个时候没有读满 buffer,只读到了部分有效数据,n<len(p),err==EOF,n 指明有效数据的大小;
  3. 要么就是读失败,这个时候 err 标示错误码;

ReadAt 绝对不允许出现,没有读满 buffer,又非 EOF,又没有 err 的情况发生,这个是接口语义明确规定的,这是一个非常细节的区别。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值