我的编程空间,编程开发者的网络收藏夹
学习永远不晚

GoLang bytes.Buffer怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

GoLang bytes.Buffer怎么使用

这篇文章主要介绍“GoLang bytes.Buffer怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“GoLang bytes.Buffer怎么使用”文章能帮助大家解决问题。

一、bytes.Buffer的基础知识

strings.Builder一样,bytes.Buffer也是开箱即用的。

bytes.Buffer类型的用途主要是作为字节序列的缓冲区。

在内部,bytes.Buffer类型使用字节切片作为内容容器,并有一个int类型的字段作为已读计数,这个已读计数无法通过bytes.Buffer提供的方法计算出来。

var buffer1 bytes.Buffercontents := "Simple byte buffer for marshaling data"  // Write contents "Simple byte buffer for marshaling data"fmt.Printf("Write contents %q\n", contents)buffer1.WriteString(contents)  // The length of buffer: 38fmt.Printf("The length of buffer: %d\n", buffer1.Len())  // The capacity of buffer: 64fmt.Printf("The capacity of buffer: %d\n", buffer1.Cap())

strings.Reader类型的Len方法一样,buffer1的Len方法返回的也是内容容器中未被读取部分的长度,而不是其中已存内容的总长度。

Buffer 值的长度是未读内容的长度,而不是已读内容的长度。

p1 := make([]byte, 7)n, _ := buffer1.Read(p1)// 7 bytes were read. (call Read)fmt.Printf("%d bytes were read. (call Read)\n", n)// The length of buffer: 31fmt.Printf("The length of buffer: %d\n", buffer1.Len())// The capacity of buffer: 64fmt.Printf("The capacity of buffer: %d\n", buffer1.Cap())

Buffer值的容量是它的内容容器(也就是那个字节切片)的容量,它只与当前值之上的写操作有关,并随着内容的写入而不断增长。

二、bytes.Buffer类型的值已读计数的作用

读取内容时,相应方法会依据已读计数找到未读内容,并在读取之后更新计数;

相应方法包括所有名称以Read开头的方法,以及Next方法和WriteTo方法。

写入内容时,如需扩容,相应方法会根据已读计数实现扩容策略;

写入时,如果没有足够的容量,就会对容器进行扩容。

扩容时,方法会在必要时,依据已读计数找到未读部分,并把其中的内容拷贝到扩展容器的头部位置。然后,方法会把已读计数值置为0。

相应方法包括所有名称以Write开头的方法,以及ReadFrom方法。

截断内容时,相应方法截断的时已读计数代表索引之后的未读部分;

截断方法Truncate,接受一个int类型的参数,表示在截断时需要保留头部多少个字节。

这里的头部是未读部分的头部,而不是内容容器的头部。

这种情况下,已读计数的值再加上参数值后得到的和,就是内容容器新的总长度。

读回退时,相应方法会使用已读计数记录回退点;

用于读回退的方法有UnreadByte和UnreadRune。这两个方法分别用于回退一个字节和回退一个Unicode字符。

回退的前提是,在调用它们之前的那一个操作必须是“读取”,并且是成功的读取,否则这些方法就只会忽略后续操作并返回一个非nil的错误值。

只有紧挨在调用ReadRune方法之后,对UnreadRune方法对调用才能够成功完成。

重置内容时,相应方法会把已读计数置为0;

导出内容时,相应方法只会导出已读计数代表的索引之后的未读部分;

Buffer值的Bytes和String方法,只会访问未读部分的内容,并返回相应的结果值。

获取长度时,相应方法会依据已读计数和内容容器的长度,计算未读部分的长度并返回;

Buffer值的Len方法返回的是内容容器未读部分的长度。

三、bytes.Buffer的扩容策略

bytes.Buffer既可以手动扩容,也可以自动扩容。除非完全确定后续内容所需的字节数,否则让Buffer自动扩容就好了。这两种方式的扩容策略一样。

扩容策略:

判断内容容器的剩余容量,是否满足调用方的要求,是否足够容纳新的内容;

如果剩余容量满足容纳新的内容,就在当前的内容容器之上,进行长度扩容;

buf = buf[:length+need]

如果剩余容量不满足容纳新的内容,就会用新的内容容器去替代原有的内容容器,从而实现扩容;

这里有一个优化,如果当前内容容器的容量的一半,仍然大于或等于现有长度(即未读字节数)再加上另需字节数的和,即:

cap(buf)/2 >= len(buf) + need

那么扩容代码就会复用现有的内容容器,并把容器中的未读内容拷贝到它的头部位置。

这意味着,其中的已读内容,将会全部被未读内容和之后的新内容覆盖掉。

如果当前内容容器的容量小于新长度的二倍。这时,就会把原有容器中的未读内容拷贝进去,最后再用新的容器替换掉原有的容器。这个新容器将会等于原有容量的二倍,再加上另需字节数的和。

新容器的容量 = 原有容量 * 2 + 所需字节数

扩容还会把已读计数置为0。

对于处于零值状态的Buffer值来说,如果第一次扩容时另需的字节数小于等于64,那么该值就会基于一个预先定义好的、长度为64的字节数组来创建内容容器。

这种情况下,容器的容量就是64。这样做的目的是为了让Buffer值在刚被真正使用的时候,可以快速的做好准备。

四、bytes.Buffer的哪些方法会造成内容的泄露

这里的内容泄露是指,使用Buffer值的一方通过某种非标准的方式,得到本不该得到的内容。

bytes.Buffer中,Bytes方法和Next方法都有可能会造成内容的泄露。原因在于,它们都把基于内容容器的切片直接返回给了方法的调用方。

通过切片,我们可以直接访问和操纵它们的底层数组,不论这个切片是基于某个数组得来的,还是痛哦过对另一个切片做切片操作获得的,都是如此。

bytes.Buffer的Bytes方法和Next方法返回的字节切片,都是通过对内容容器的切片做切片操作得到的。

contents := "ab"buffer1 := bytes.NewBufferString(contents)// The capacity of new buffer with contents "ab": 8// 容量为何为8,看 runtime/string.go#stringtoslicebyte()fmt.Printf("The capacity of new buffer with contents %q: %d\n", contents, buffer1.Cap())unreadBytes := buffer1.Bytes()// The unread bytes of the buffer: [97 98]fmt.Printf("The unread bytes of the buffer: %v\n", unreadBytes)buffer1.WriteString("cdefg")// The capacity of new buffer with contents "ab": 8fmt.Printf("The capacity of new buffer with contents %q: %d\n", contents, buffer1.Cap())unreadBytes = unreadBytes[:cap(unreadBytes)]// 基于前面的内容获取到结果值// The unread bytes of the buffer: [97 98 99 100 101 102 103 0]fmt.Printf("The unread bytes of the buffer: %v\n", unreadBytes)// 操纵bufferunreadBytes[len(unreadBytes)-2] = byte('X')// The unread bytes of the buffer: [97 98 99 100 101 102 88 0]fmt.Printf("The unread bytes of the buffer: %v\n", unreadBytes)

关于“GoLang bytes.Buffer怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

GoLang bytes.Buffer怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

GoLang bytes.Buffer怎么使用

这篇文章主要介绍“GoLang bytes.Buffer怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“GoLang bytes.Buffer怎么使用”文章能帮助大家解决问题。一、bytes.
2023-07-05

bytes.Buffer怎么在golang中使用

bytes.Buffer怎么在golang中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。go适合做什么go是golang的简称,而golang可以做服务器
2023-06-14

将 bytes.Buffer 与 csv.writer 结合使用

从现在开始,我们要努力学习啦!今天我给大家带来《将 bytes.Buffer 与 csv.writer 结合使用》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们
将 bytes.Buffer 与 csv.writer 结合使用
2024-04-05

Go库bytes.Buffer和strings.Builder使用及性能对比

这篇文章主要为大家介绍了Go库bytes.Buffer和strings.Builder使用及性能对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-15

golang cookiejar怎么使用

这篇文章主要讲解了“golang cookiejar怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang cookiejar怎么使用”吧!什么是cookiejarcookiej
2023-07-05

Golang time.Sleep()怎么使用

这篇文章主要讲解了“Golang time.Sleep()怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang time.Sleep()怎么使用”吧!在Go语言中,时间包提供了
2023-07-05

golang Gob怎么使用

本篇内容介绍了“golang Gob怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!gob是Golang包自带的一个数据结构序列化的编
2023-07-05

GoLang sync.Pool怎么使用

这篇文章主要讲解了“GoLang sync.Pool怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“GoLang sync.Pool怎么使用”吧!使用场景一句话总结:保存和复用临时对象
2023-07-04

golang pool怎么使用

Pool 在 Go 语言中常用于限制资源的使用量,以避免资源过度消耗。在 Golang 中,可以使用 `sync.Pool` 来实现对象池。以下是使用 `sync.Pool` 的一般步骤:首先,定义要在池中存储的对象的类型。type Obj
2023-10-26

golang中的.()怎么使用

这篇文章主要介绍“golang中的.()怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“golang中的.()怎么使用”文章能帮助大家解决问题。什么是.()用法?在golang中,.()被称为
2023-07-05

golang sort库怎么使用

Go语言的sort包提供了对切片、数组和用户自定义集合的排序功能。 使用sort库进行排序的一般步骤如下:导入sort库:import "sort"定义切片或数组:nums := []int{4, 2, 7, 1, 5}使用sort.S
2023-10-26

golang image库怎么使用

使用Golang的image库,可以进行图像的读取、操作和保存等操作。下面是一个简单的示例:package mainimport ("fmt""image""image/jpeg""os")func main() {// 打开图像文件f
golang image库怎么使用
2024-02-29

golang expect包怎么使用

本文小编为大家详细介绍“golang expect包怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang expect包怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。这里如果使用su切换用
2023-06-27

golang中怎么使用gopath

小编给大家分享一下golang中怎么使用gopath,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!golang gopath的新用法从使用golang开发项目以来
2023-06-14

golang中channel怎么使用

今天小编给大家分享一下golang中channel怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是 channe
2023-06-29

golang中defer怎么使用

这篇文章主要介绍“golang中defer怎么使用”,在日常操作中,相信很多人在golang中defer怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang中defer怎么使用”的疑惑有所帮助!
2023-07-02

Golang的select怎么使用

本文小编为大家详细介绍“Golang的select怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang的select怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。背景golang 中主推
2023-07-04

Golang中的Mutex怎么使用

本篇内容介绍了“Golang中的Mutex怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Mutex基本概念Mutex 是 Go 语言
2023-07-05

golang select语句怎么使用

在Go语言中,select语句用于在多个通信操作中选择一个进行执行。select语句的基本语法如下:goselect {case <- channel1: // 执行channel1的操作case data := <- channel
2023-10-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录