当前位置:首页 > 科技  > 软件

Golang 中的 Bytes 包详解之Bytes.Buffer

来源: 责编: 时间:2023-11-07 09:12:49 376观看
导读Golang 中的 bytes 包是其中一个 IO 操作标准库,实现了对字节切片([]byte)的操作,提供了类似于 strings 包的功能。本文先讲解一下 bytes 包中的结构体 bytes.Buffer。bytes.Bufferbytes.Buffer 实现了 io.Writer、io.Rea

aeP28资讯网——每日最新资讯28at.com

Golang 中的 bytes 包是其中一个 IO 操作标准库,实现了对字节切片([]byte)的操作,提供了类似于 strings 包的功能。本文先讲解一下 bytes 包中的结构体 bytes.Buffer。aeP28资讯网——每日最新资讯28at.com

bytes.Buffer

bytes.Buffer 实现了 io.Writer、io.Reader、io.ByteScanner、io.RuneScanner、io.WriterTo、io.ByteWriter 和 io.ReaderFrom 等接口,可以很方便地实现对字节数据的读写和操作。主要特点是提供了一个缓冲区,可以在内存中动态分配缓冲区,以高效地写入和读取字节数据。在处理数据时,特别是数据拼接操作时,效率往往比直接使用字符串拼接要高很多。结构体定义和对应的方法如下:aeP28资讯网——每日最新资讯28at.com

type Buffer struct {	buf      []byte // contents are the bytes buf[off : len(buf)]	off      int    // read at &buf[off], write at &buf[len(buf)]	lastRead readOp // last read operation, so that Unread* can work correctly.}

其中,buf 保存了实际的字节缓存,off 表示下一个读写操作的偏移量,lastRead 表示最后一次读取操作的类型和大小。aeP28资讯网——每日最新资讯28at.com

bytes.Buffer 提供的主要方法包括:aeP28资讯网——每日最新资讯28at.com

  • ReadFrom,从 io.Reader 中读取数据,并写入到缓冲区中。
  • WriteTo,从缓冲区中读取数据,并写入到 io.Writer 中。
  • WriteByte、WriteRune、WriteString,分别用于将单个字节、Unicode 字符和字符串写入缓冲区中。
  • ReadByte、ReadRune、ReadString,分别用于从缓冲区中读取单个字节、Unicode 字符和字符串。
  • Bytes、String,返回缓冲区中的字节切片和字符串。
  • Reset,用于重置缓冲区,将其扩容为默认大小(64 字节)。

其他方法就不一一说明了,最好自己去看去使用去体会。aeP28资讯网——每日最新资讯28at.com

使用示例

简单使用示例如下:aeP28资讯网——每日最新资讯28at.com

package mainimport (	"bytes"	"encoding/binary"	"fmt"	"io"	"os")func main() {	var buf bytes.Buffer	// 写入一个字节	err := buf.WriteByte('a')	if err != nil {		fmt.Println(err)		return	}	// 写入一个字符串	_, err = buf.WriteString("b")	if err != nil {		fmt.Println(err)		return	}	// 写入一个无符号整数	var u uint32 = 12345	err = binary.Write(&buf, binary.LittleEndian, u)	if err != nil {		fmt.Println(err)		return	}	// 读取一个字节	b, err := buf.ReadByte()	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(b)) // a	// 读取一个字符串	s, err := buf.ReadString('/n')	if err != nil {		fmt.Println(err)		return	}	fmt.Println(s) // b	// 读取无符号整数	var u2 uint32	err = binary.Read(&buf, binary.LittleEndian, &u2)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(u2) // 12345	// 拷贝到标准输出中	_, err = io.Copy(os.Stdout, &buf)	if err != nil {		fmt.Println(err)		return	}	// 读取到 []byte 中,并以字符串输出	data, err := io.ReadAll(&buf)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(data))}

首先创建了一个 bytes.Buffer 对象 buf,分别使用 WriteByte、WriteString 和 binary.Write 方法向缓冲区中写入一个字节、一个字符串和一个无符号整数。然后分别使用 ReadByte、ReadString 和 binary.Read 方法从缓冲区中读取了一个字节、一个字符串和一个无符号整数。接下来使用 io.Copy 方法和 os.Stdout 将缓冲区中的数据拷贝到标准输出中,最后使用 io.ReadAll 方法将缓冲区中的所有数据读取到一个字节切片中,并转换为一个字符串。aeP28资讯网——每日最新资讯28at.com

小结

使用 bytes.Buffer 可以方便高效地处理字节数据,避免频繁地对底层的字节数组进行扩容和复制,从而提高性能。aeP28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17374-0.htmlGolang 中的 Bytes 包详解之Bytes.Buffer

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Shardingjdbc启动优化,你学会了吗?

下一篇: 借助Python库CuPy,发掘GPU的威力

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 最“俊美”淘宝卖家,靠直播和短视频圈粉,上架秒光,年销3000万

    来源 | 电商在线文|易琬玉编辑|斯问受访店铺:Ringdoll戒之人形图源:微博@御座的黄山、“Ringdoll戒之人形”淘宝店铺有关外貌的评价,黄山已经听累了。生于1985年的他,哪
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。“提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
Top