当前位置: 首页 > news >正文

下做图软件在哪个网站下载器com天堂网

下做图软件在哪个网站下载器,com天堂网,seo公司哪家,梅州兴宁网站建设培训Go的bytes.Buffer 文章目录Go的bytes.Buffer一、bytes.Buffer 的基础知识二、bytes.Buffer类型的值,已读计数的作用三、bytes.Buffer的扩容策略四、bytes.Buffer的哪些方法会造成内容的泄露一、bytes.Buffer 的基础知识 与strings.Builder一样,bytes.Bu…

Go的bytes.Buffer

文章目录

  • Go的bytes.Buffer
    • 一、bytes.Buffer 的基础知识
    • 二、`bytes.Buffer`类型的值,已读计数的作用
    • 三、`bytes.Buffer`的扩容策略
    • 四、`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自动扩容就好了。这两种方式的扩容策略一样。

扩容策略:

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

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

    buf = buf[:length+need]
    
  3. 如果剩余容量不满足容纳新的内容,就会用新的内容容器去替代原有的内容容器,从而实现扩容;

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

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

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

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

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

    新容器的容量 = 原有容量 * 2 + 所需字节数
    
  2. 扩容还会把已读计数置为0。

  3. 对于处于零值状态的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)
http://www.yayakq.cn/news/612003/

相关文章:

  • 制作网站的代码建设学校网站的报告
  • 郑州网站设计专家做包装盒有哪些网站
  • 东莞网站优化平台企业年报网上申报入口免费官方
  • 软件跟网站开发抖音推广项目计划书
  • 昆明微信网站建设人社门户网站建设方案
  • 网站虚拟主机销售手机网站开发是什么
  • 网站备案号代码上海高端网站定制开发
  • 重庆人居建设集团网站wordpress创建目录
  • 哪家高端网站建设好宁夏做网站的
  • 永春县住房和城乡规划建设局网站网络运营课程培训班
  • 自已建网站做南美生意做什么网站好
  • 泰安网站建设哪家专业免费推广广告链接
  • 网站设计与应用方向论文ppt制作软件模板网站
  • 公司地址怎么注册定位网页优化与网站优
  • 贵州省建设监理协会网站是什么动画设计专业哪个学校比较好
  • 昆山城市建设网站做网站老板嫌弃太丑谁的锅
  • 专业服务好的网站设计制作蜜蜂vp加速器七天试用
  • jquery网站模版英国网站后缀
  • 网站设计登录界面怎么做企业微信自建应用怎么开发
  • 莆田专门做网站该网站的域名为
  • 湖北襄阳网站建设视觉设计的特点和优势
  • 多语言网站建设费用开发公司工程部管理制度
  • 常熟做网站多少钱wordpress评论去掉邮箱
  • 网站开发的技术分类网站美工怎么做
  • 高端网站特色百度竞价推广代理
  • 网上做网站东湖南昌网站建设公司
  • 网站详细设计报价平台
  • apache 网站建设深圳市建设项目
  • 大连淘宝网站建设手机银行app下载安装
  • 公司网站后如何更新商业网络平台