golang中bytes包(转载)

golang标准库中提供了bytes包,该包几乎和strings包给string提供的功能一样,只不过bytes包对应的是[]byte。和strings一样,并不修改传入变量,而是返回其副本修改之后的内容。

整个包分为以下几种操作:转换、比较、去除、分割、查找、替换

1. 转换

  • 将s的副本中所有字符修改成大写(小写),然后返回

  • 使用指定的映射表将对s的副本中的所有字符进行修改,然后返回

  • 将s的副本中的所有单词的首字符修改为Title格式返回。

2. 比较

  • 比较两个[]byte,nil参数相当于[]byte{};

  • 判断a、b是否相等,nil参数相当[]byte{}。

  • 判断s、t是否相似,忽略大写、小写、标题三种格式的区别。

3. 去除

  • 去除s的副本左右包含cutset中的字符(返回s的副本)

  • 去掉s副本的左右边中f函数中返回true的字符

  • 去除s副本两边的空白(unicode.IsSpace)

  • 去掉s副本的前缀prefix(后缀suffix)

4. 分割

  • Split函数分割
    Split函数以sep为分隔符将s的副本切割分成多个子串,结果不包含分隔符。
    如果sep为空,则将s的副本分割成Unicode字符列表。
    SplitN可以指定分割次数,超出n的部分将不进行分割,n小于0,表示分割所有。

  • 功能同Split,只不过结果包含分隔符(在各个子串尾部)

  • 以连续空白为分隔符将s的副本分隔成多个子串,结果不包含分隔符。

  • 以符合f的字符为分隔符将s的副本分割成多个子串,结果不包含分割符。

  • 以sep为连接符,将子串列表s的副本连接成一个字节串。

  • 将子串b重复count次后返回。

5. 查找

  • 判断s是否有前缀prefix(后缀suffix)

  • 判断b中是否包含子串subslice(字符r)

  • 判断b中是否包含chars中的任何一个字符

  • 查找子串sep(字节c、字符r)在s中第一次出现的位置,找不到则返回-1。

  • 查找chars中的任何一个字符在s中第一次出现的位置,找不到则返回-1。

  • 查找符合f的字符在s中第一次出现的位置,找不到则返回-1。

  • 功能同上,只不过查找最后一次出现的位置。

  • 获取sep在s中出现的次数

6. 替换

  • 将s副本中的前n个old替换为new,n<0则替换全部。

  • 将s副本中字符替换为mapping(r)的返回值,如果mapping返回负值,则丢弃该字符。

  • 将s副本转换为[]rune类型返回

7. Reader

  • 将切片b封装成bytes.Reader对象

  • bytes.Reader实现了如下接口:
    1)io.ReadeSeeker
    2)io.ReaderAt
    3)io.WriterTo
    4)io.ByteScanner
    5)io.RuneScanner

8. Buffer

8.1. Buffer函数基础

Buffer是一个缓存,没有底层数据,缓存的容量会根据需要自动调整。大多数情况下,使用new(Buffer)就足以初始化一个Buffer了。

  • bytes.Buffer实现了如下接口:
    1)io.ReadWrite
    2)io.ReaderFrom
    3)io.WriterTo
    4)io.ByteWriter
    5)io.ByteScanner
    6)io.RuneScanner

  • 未读取部分的数据长度

  • 缓存的容量

  • 读取前n字节的数据并以切片形式返回,如果数据长度小于n,则全部读取。切片只在下一次读写操作前合法。

  • 读取第一个delim及其之前的内容,返回遇到的错误(一般是io.EOF)。

  • 写入r的UTF-8编码,返回写入的字节数和error。保留err是为了匹配bufio.Write的WriteRune

  • 写入s,返回写入的字节数和error。

  • 引用未读取部分的数据部分的数据切片(不移动读取位置)

  • 返回未读取部分的数据字符串(不移动读取位置)

  • 自动增加缓存容量,以保证有n字节的剩余空间。如果n小于0或无法增加则会panic。

  • 将数据长度截短到n字节,如果n小于0或大于Cap则panic。

  • 重设缓冲区,清空所有数据(包括初始内容)。

8.2. Buffer Write测试用例

8.3. Buffer Read测试用例


赞赏

微信赞赏支付宝赞赏

发表评论

邮箱地址不会被公开。 必填项已用*标注