Go 语言的标准库 bytes
包提供了一组用于操作字节切片 ([]byte
) 的函数。这个包中的函数与 strings
包中的函数非常类似,但它们操作的是字节切片,而不是字符串。字节切片在 Go 语言中是一种非常重要的数据类型,广泛用于处理二进制数据和文本数据。bytes
包提供了很多处理字节切片的工具,包括但不限于查找、比较、切分、连接、替换、转换等操作。
1. 查找和比较
func Compare(a, b []byte) int
: 比较两个字节切片,类似于strings.Compare
。如果a
比b
小,返回 -1;如果相等,返回 0;如果a
比b
大,返回 1。func Contains(b, subslice []byte) bool
: 判断字节切片b
是否包含subslice
。func ContainsAny(b []byte, chars string) bool
: 判断字节切片b
是否包含字符串chars
中的任意一个字符。func ContainsRune(b []byte, r rune) bool
: 判断字节切片b
是否包含 Unicode 字符r
。func Count(b, sep []byte) int
: 计算sep
在b
中出现的次数。func Equal(a, b []byte) bool
: 判断两个字节切片是否相等。func EqualFold(s, t []byte) bool
: 判断两个字节切片在忽略大小写的情况下是否相等。func Index(b, sep []byte) int
: 返回sep
在b
中第一次出现的位置索引,如果未找到则返回 -1。func IndexAny(b []byte, chars string) int
: 返回chars
中任意一个字符在b
中第一次出现的位置索引,如果未找到则返回 -1。func IndexByte(b []byte, c byte) int
: 返回c
在b
中第一次出现的位置索引。func IndexRune(b []byte, r rune) int
: 返回r
在b
中第一次出现的位置索引。func LastIndex(b, sep []byte) int
: 返回sep
在b
中最后一次出现的位置索引。func LastIndexAny(b []byte, chars string) int
: 返回chars
中任意一个字符在b
中最后一次出现的位置索引。func LastIndexByte(b []byte, c byte) int
: 返回c
在b
中最后一次出现的位置索引。
2. 修改
func Replace(s, old, new []byte, n int) []byte
: 返回一个新的字节切片,其中s
中的前n
个old
被替换为new
。如果n
为 -1,则替换所有出现的old
。func Map(mapping func(r rune) rune, s []byte) []byte
: 返回一个新的字节切片,其中s
中的每个字符被mapping
函数转换。func ToLower(s []byte) []byte
: 将字节切片中的所有字符转换为小写。func ToUpper(s []byte) []byte
: 将字节切片中的所有字符转换为大写。func ToTitle(s []byte) []byte
: 将字节切片中的所有字符转换为标题格式。func Trim(s []byte, cutset string) []byte
: 去除s
开头和结尾处的cutset
中的字符。func TrimFunc(s []byte, f func(r rune) bool) []byte
: 去除s
开头和结尾处满足函数f
的字符。func TrimSpace(s []byte) []byte
: 去除s
开头和结尾的空白字符。func TrimPrefix(s, prefix []byte) []byte
: 去除s
的前缀prefix
。func TrimSuffix(s, suffix []byte) []byte
: 去除s
的后缀suffix
。
3. 切分和拼接
func Split(s, sep []byte) [][]byte
: 将字节切片s
按照分隔符sep
切分,返回一个切片的切片。如果sep
为空,则将s
每个字节切分。func SplitN(s, sep []byte, n int) [][]byte
: 将s
按sep
切分成最多n
个子切片。func SplitAfter(s, sep []byte) [][]byte
: 类似于Split
,但保留分隔符。func SplitAfterN(s, sep []byte, n int) [][]byte
: 类似于SplitN
,但保留分隔符。func Join(s [][]byte, sep []byte) []byte
: 将多个子字节切片连接为一个字节切片,使用sep
作为分隔符。
4. 转换
func NewReader(b []byte) *Reader
: 返回一个新的Reader
,从字节切片b
读取数据。func Repeat(b []byte, count int) []byte
: 返回一个新的字节切片,其中b
重复count
次。func Runes(s []byte) []rune
: 将字节切片s
转换为 Unicode 字符切片。func ToValidUTF8(s, replacement []byte) []byte
: 将字节切片s
中无效的 UTF-8 字符替换为replacement
。
5. 缓冲区操作
bytes.Buffer
类型提供了一个用于高效地读写字节的缓冲区。
func (b *Buffer) Bytes() []byte
: 返回缓冲区中的字节切片。func (b *Buffer) String() string
: 返回缓冲区中的数据作为字符串。func (b *Buffer) Write(p []byte) (n int, err error)
: 将字节切片p
写入缓冲区。func (b *Buffer) WriteString(s string) (n int, err error)
: 将字符串s
写入缓冲区。func (b *Buffer) WriteByte(c byte) error
: 将单个字节写入缓冲区。func (b *Buffer) WriteRune(r rune) (n int, err error)
: 将单个 Unicode 字符写入缓冲区。func (b *Buffer) Read(p []byte) (n int, err error)
: 从缓冲区读取数据到字节切片p
。func (b *Buffer) ReadByte() (byte, error)
: 读取单个字节。func (b *Buffer) ReadRune() (r rune, size int, err error)
: 读取单个 Unicode 字符。func (b *Buffer) Next(n int) []byte
: 返回缓冲区中的前n
个字节,并将它们从缓冲区中移除。
6. Reader
bytes.Reader
是另一个重要类型,它允许从字节切片读取数据。它的主要功能是实现了 io.Reader
、io.ReaderAt
、io.WriterTo
、io.Seeker
、io.ByteScanner
、io.RuneScanner
等接口。
func (r *Reader) Len() int
: 返回未读部分的长度。func (r *Reader) Size() int64
: 返回Reader
的长度。func (r *Reader) Read(b []byte) (n int, err error)
: 将数据从Reader
读入字节切片b
。func (r *Reader) ReadAt(b []byte, off int64) (n int, err error)
: 从Reader
的指定位置开始读数据。func (r *Reader) ReadByte() (byte, error)
: 读取一个字节。func (r *Reader) ReadRune() (r rune, size int, err error)
: 读取一个 Unicode 字符。func (r *Reader) Seek(offset int64, whence int) (int64, error)
: 移动Reader
的读取位置。