注册 登录

清河洛

Go语言中的bytes包

qingheluo2025-03-12清河洛91
bytes包实现了操作[]byte的常用函数,本包的函数和strings包的函数类似比较函数 Compare(a, b []byte) int 按字典顺序比较两个切片 a == b返回 0,a < b返回 -1,a > b返回 +1 Equal(a, b []byte) bool a 和 b 是否相等(区分大小写) EqualFold(s, t []byte) bool s 和 t 是否相等(不区分大小写) 连接函数 Join(s [][]byte, sep []byte) []byte 将 s 的元素使用 sep 连接起来 Repeat(b []b...

bytes包实现了操作[]byte的常用函数,本包的函数和strings包的函数类似

比较函数

Compare(a, b []byte) int      按字典顺序比较两个切片
    a == b返回 0,a < b返回 -1,a > b返回 +1
Equal(a, b []byte) bool       a 和 b 是否相等(区分大小写)
EqualFold(s, t []byte) bool   s 和 t 是否相等(不区分大小写)

连接函数

Join(s [][]byte, sep []byte) []byte   将 s 的元素使用 sep 连接起来
Repeat(b []byte, count int) []byte    将 b 重复 count 次

查找函数

字节查找
Contains(b, sub []byte) bool      b中是否包含sub
Count(s, sep []byte) int          s 中 sep 的出现次数,sep未返回len(s)+1
HasPrefix(s, prefix []byte) bool  s 前缀是否为prefix
HasSuffix(s, suffix []byte) bool  s 后缀是否为prefix
Index(s, sep []byte) int          s 中 sep 第一次出现的索引,不存在返回 -1
IndexByte(b []byte, c byte) int   b 中 c 第一次出现的索引
LastIndex(s, sep []byte) int      s 中 sep 最后一次出现的索引
LastIndexByte(s []byte, c byte) int  s 中 c 最后一次出现的索引


rune查找
ContainsAny(b []byte, chars string) bool
    b中是否包含chars中任意一个UTF-8编码的rune
ContainsFunc(b []byte, f func(rune) bool) bool
    b中是否包含任意一个满足 f(r)的rune
ContainsRune(b []byte, r rune) bool   r是否包含在b中

IndexAny(s []byte, chars string) int
    s 中chars任意一个UTF-8编码的rune首次出现的索引
IndexFunc(s []byte, f func(r rune) bool) int
    s 中第一个满足 f(c) 的UTF-8编码的rune索引
IndexRune(s []byte, r rune) int
    rune 在 s 中第一次出现的字节索引
    如果 r 不是有效的UTF-8字节,返回任何无效UTF-8字节序列第一次出现的索引
LastIndexAny(s []byte, chars string) int
    s 中chars任意一个UTF-8编码的rune最后一次出现的索引
LastIndexFunc(s []byte, f func(r rune) bool) int
    返回 s 中最后一个满足 f(c) 的rune索引

大小写转换

ToLower(s []byte) []byte   所有字母都转为小写
ToLowerSpecial(c unicode.SpecialCase, s []byte) []byte
    相当于ToLower,但是会优先考虑 c 中的特殊大小写规则
ToTitle(s []byte) []byte   所有字母都转为标题大小写
ToTitleSpecial(c unicode.SpecialCase, s []byte) []byte
ToUpper(s []byte) []byte   所有字母都转为大写
ToUpperSpecial(c unicode.SpecialCase, s []byte) []byte

替换函数

ToValidUTF8(s, rep []byte) []byte
    将 s 中无效 UTF-8 字节替换为rep

Replace(s, old, new []byte, n int) []byte
    替换 s 中前 n 个 old 为 new,n < 0 表示替换次数不限制
    如果 old 为空,会在切片的开头和每个 UTF-8 字节之后匹配
ReplaceAll(s, old, new []byte) []byte
    替换所有 old 为 new,相当于Replace()中n为-1

Map(mapping func(r rune) rune, s []byte) []byte
    返回 s 所有rune均根据mapping函数进行替换后的字节副本
    如果mapping返回负值,则该字符不进行替换而是从字节切片中删除

CutPrefix(s, prefix []byte) (after []byte, found bool)
    将 s 去除前缀prefix,返回原始切片的切片,而不是副本
    返回去除前缀后的字节数组和s中前缀是否为prefix
    前缀不是prefix返回 s, false
    prefix是空字节切片返回 s, true
CutSuffix(s, suffix []byte) (before []byte, found bool)
    将 s 去除后缀suffix

Trim(s []byte, cutset string) []byte  去除cutset中包含的所有前后缀
TrimSpace(s []byte) []byte            去除 s 中所有空格前后缀
TrimFunc(s []byte, f func(r rune) bool) []byte
    去除 s 中所有满足 f(c) 的所有前后缀
TrimLeft(s []byte, cutset string) []byte 去除cutset中包含的所有前缀
TrimLeftFunc(s []byte, f func(r rune) bool) []byte
TrimRight(s []byte, cutset string) []byte  去除cutset中包含的所有后缀
TrimRightFunc(s []byte, f func(r rune) bool) []byte
TrimPrefix(s, prefix []byte) []byte      去除 s 的前缀prefix
TrimSuffix(s, suffix []byte) []byte      去除 s 的后缀prefix

分割函数

Cut(s, sep []byte) (before, after []byte, found bool)
    使用s中第一个出现的sep分割s,返回sep之前和之后的字节切片
    found表示s中是否存在sep,如不存在,返回 s,nil,false
    返回原始切片的切片,而不是副本
Fields(s []byte) [][]byte    以一个或多个连续空格字符分割
    如果 s 仅包含空格,则返回空切片
FieldsSeq(s []byte) iter.Seq[[]byte]  同Fields,但返回一个迭代器
FieldsFunc(s []byte, f func(rune) bool) [][]byte
    在满足 f(c) 的字节处分割,多个连续满足的字节视为一个分隔符
FieldsFuncSeq(s []byte, f func(rune) bool) iter.Seq[[]byte]
    效果同FieldsFunc,但是返回一个迭代器
Lines(s []byte) iter.Seq[[]byte]
    返回以换行符分割的一次性迭代器(结果包含换行符)
SplitN(s, sep []byte, n int) [][]byte
    将 s 拆分为由 sep 分隔的子切片
    如果 sep 为空,会在每个UTF-8字节后拆分
        n > 0 :最多 n 个子切片,最后一个子切片将是未分割的余项
        n == 0:结果为 nil(零子切片)
        n < 0 :所有子切片
Split(s, sep []byte) [][]byte
    相当于 n 为 -1 的 SplitN
SplitSeq(s, sep []byte) iter.Seq[[]byte]
    相当于Split,但是返回一个一次性迭代器
SplitAfterN(s, sep []byte, n int) [][]byte
    将 s 拆分为每个 sep 之后的子切片
    sep 为空会在每个 UTF-8 字节后进行分割
SplitAfter(s, sep []byte) [][]byte
    相当于 n 为 -1 的 SplitAfterN
SplitAfterSeq(s, sep []byte) iter.Seq[[]byte]
    相当于SplitAfter,但是返回一个一次性迭代器

其他函数

Clone(b []byte) []byte    返回 b[:len(b)] 的副本
Runes(s []byte) []rune    将UTF-8编码的 s 转换为rune切片

type Buffer struct{}

Buffer是一个可变大小的字节缓冲区,零值是一个可供使用的空缓冲区

创建Buffer

NewBuffer(buf []byte) *Buffer
    使用 buf 作为其初始内容来创建并初始化一个新的Buffer
NewBufferString(s string) *Buffer
    使用字符串 s 作为初始内容来创建并初始化一个新的Buffer

在大多数情况下,new(Buffer)或声明一个Buffer变量就足以初始化一个Buffer
buf := new(bytes.Buffer)
var buf *bytes.Buffer
buf := &bytes.Buffer{}

常用方法

Available() int    返回缓冲区中未使用的字节数
AvailableBuffer() []byte
    返回一个具有 b.Available() 容量的空缓冲区用于附加到并传递给紧接着的Buffer.Write调用
    该缓冲区仅在 b 上的下一个写入操作之前有效
Bytes() []byte
    返回一个包含缓冲区的未读部分,长度为 b.Len() 的切片
    该切片仅在下一次缓冲区修改前有效
    对切片内容的更改会影响未来读取的结果
Cap() int
    返回缓冲区底层字节切片的容量,即缓冲区的数据分配的总空间
Grow(n int)
    增大缓冲区的容量以保证至少可以将 n 个字节写入缓冲区而无需进行其他分配
Len() int
    返回缓冲区未读部分的字节数
Next(n int) []byte
    返回包含缓冲区中接下来 n 个字节的切片,并推进缓冲区,就像这些字节已由Buffer.Read返回一样
    如果缓冲区中的字节少于 n 个,返回整个缓冲区
    返回的切片仅在下次调用 read 或 write 方法之前有效
Read(p []byte) (n int, err error)
    从缓冲区读取 len(p) 个字节,或者直到缓冲区读完,返回读取的字节数
    如果缓冲区没有数据,err 为io.EOF
ReadByte() (byte, error)
    从缓冲区读取并返回下一个字节,如果没有可用字节返回错误io.EOF
ReadBytes(delim byte) (line []byte, err error)
    读取直到第一次出现delim并返回读取的切片(包含delim)
    如果在找到delim之前遇到错误会返回错误之前读取的数据和错误本身
    当且仅当返回的数据不以delim结尾时才会返回 err != nil
ReadFrom(r io.Reader) (n int64, err error)
    从 r 读取数据直到 EOF,并将其附加到缓冲区
    返回值 n 表示读取的字节数
    读取期间遇到的任何错误(io.EOF除外)也会返回
ReadRune() (r rune, size int, err error)
    从缓冲区读取并返回下一个UTF-8编码的Unicode字节
    如果没有可用字节返回错误 io.EOF
    如果字节是错误的 UTF-8 编码会消耗一个字节并返回 U+FFFD,1
ReadString(delim byte) (line string, err error)
    读取直到第一次出现delim并返回读取的字符串(包含delim)
    如果在找到delim之前遇到错误会返回错误之前读取的数据和错误本身
    当且仅当返回的数据不以delim结尾时才会返回 err != nil
Reset()
    将缓冲区重置为空,但会保留底层存储以供将来写入使用
    与Buffer.Truncate (0)相同
String() string
    以字符串形式返回缓冲区未读部分的内容
    如果缓冲区为零指针返回""
Truncate(n int)
    丢弃缓冲区中除前 n 个未读取字节之外的所有字节
    会继续使用相同的分配存储空间
UnreadByte() error
    将最近一次成功读取操作后的读取位置回退一个字节,下一次读取操作会重新读取这个字节
    如果自上次读取后发生了写入,上次读取返回错误,上次读取了零个字节,将返回错误
UnreadRune() error
    将最近一次成功读取操作后的读取位置回退一个rune,下一次读取操作会重新读取这个rune
    如果最近的读取或写入操作不是成功的Buffer.ReadRune将返回错误
Write(p []byte) (n int, err error)
    将 p 的内容追加到缓冲区,返回追加内容的长度
WriteByte(c byte) error
    将字节 c 追加到缓冲区
WriteRune(r rune) (n int, err error)
    将 Unicode 代码点 r 的 UTF-8 编码追加到缓冲区,返回其长度和错误
WriteString(s string) (n int, err error)
    将 s 的内容追加到缓冲区,返回 s 的长度
WriteTo(w io.Writer) (n int64, err error)
    将数据写入 w,直到缓冲区耗尽或发生错误
    返回写入的字节数,写入期间遇到的任何错误也会返回

type Reader struct {}

Reader用于从字节切片读取数据,Reader是只读的并且支持查找

创建Reader

NewReader(b []byte) *Reader
    返回一个从 b 读取的新Reader

常用方法

Len() int
    返回未读部分的字节数
Read(b []byte) (n int, err error)
    读取 len(b) 个字节,或者直到缓冲区读完,返回读取的字节数
    如果缓冲区没有数据,err 为io.EOF
ReadAt(b []byte, off int64) (n int, err error)
    从off偏移量读取len(p)字节数据,返回读取的字节数
ReadByte() (byte, error)
    读取单个字节并返回该字节
ReadRune() (ch rune, size int, err error)
    读取单个编码的Unicode字符,并返回该字符及其字节大小
Reset(b []byte)
    重新设置Reader的底层数据
Seek(offset int64, whence int) (int64, error)
    设置下一次读取的位置偏移量为offset
    whence表示相对于文件什么位置计算偏移量,值为预定于常量
        io.SeekStart  =0  表示文件开头
        io.SeekCurrent=1  表示当前位置
        io.SeekEnd    =2  表示文件末尾
    返回读后相对于文件开头的偏移量和错误
Size() int64
    返回底层字节切片的原始长度
WriteTo(w io.Writer) (n int64, err error)
    将数据写入w直到没有更多的数据或发生错误,返回写入的字节数


网址导航