// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.package stringsimport ("unicode/utf8""unsafe"
)// Builder用于使用Write方法有效地构建字符串。它最大限度地减少了内存的复制。零值可使用。不要复制非零的Builer。
type Builder struct {addr *Builder // of receiver, to detect copies by valuebuf  []byte
}// noescape 在逃逸分析中隐藏了一个指针。 noescape 是恒等函数,但转义分析并不认为输出取决于输入。 noescape 是内联的,目前编译为零指令。
func noescape(p unsafe.Pointer) unsafe.Pointer {x := uintptr(p)return unsafe.Pointer(x ^ 0)
}func (b *Builder) copyCheck() {if b.addr == nil {// 这个 hack 解决了 Go 的逃逸分析失败,导致 b 逃逸并被堆分配。b.addr = (*Builder)(noescape(unsafe.Pointer(b)))} else if b.addr != b {panic("strings: illegal use of non-zero Builder copied by value")}
}// String 返回累积的字符串。
func (b *Builder) String() string {return *(*string)(unsafe.Pointer(&b.buf))
}// Len 返回累积的字节数; b.Len() == len(b.String())。
func (b *Builder) Len() int { return len(b.buf) }// Cap 返回构建器底层字节切片的容量。 它是为正在构建的字符串分配的总空间,包括已写入的任何字节。
func (b *Builder) Cap() int { return cap(b.buf) }// Reset 将Builder重置为空。
func (b *Builder) Reset() {b.addr = nilb.buf = nil
}// grow 将缓冲区复制到一个新的更大的缓冲区,以便至少有 n 个字节的容量超出 len(b.buf)。
func (b *Builder) grow(n int) {buf := make([]byte, len(b.buf), 2*cap(b.buf)+n)copy(buf, b.buf)b.buf = buf
}// 如有必要,Grow会增加b的容量,以保证另外n个字节的空间。 在Grow(n)之后,至少可以将n个字节写入 b 而无需其他分配。 如果n为负,则panic。
func (b *Builder) Grow(n int) {b.copyCheck()if n < 0 {panic("strings.Builder.Grow: negative count")}if cap(b.buf)-len(b.buf) < n {b.grow(n)}
}// Write 将 p 的内容附加到 b 的缓冲区。 Write 总是返回 len(p), nil。
func (b *Builder) Write(p []byte) (int, error) {b.copyCheck()b.buf = append(b.buf, p...)return len(p), nil
}// WriteByte 将字节 c 附加到 b 的缓冲区。 返回的错误始终为nil。
func (b *Builder) WriteByte(c byte) error {b.copyCheck()b.buf = append(b.buf, c)return nil
}// WriteRune 将 Unicode 代码点 r 的 UTF-8 编码附加到 b 的缓冲区。它返回 r 的长度和一个nil错误。
func (b *Builder) WriteRune(r rune) (int, error) {b.copyCheck()if r < utf8.RuneSelf {b.buf = append(b.buf, byte(r))return 1, nil}l := len(b.buf)if cap(b.buf)-l < utf8.UTFMax {b.grow(utf8.UTFMax)}n := utf8.EncodeRune(b.buf[l:l+utf8.UTFMax], r)b.buf = b.buf[:l+n]return n, nil
}// WriteString 将 s 的内容附加到 b 的缓冲区。它返回 s 的长度和一个nil错误。
func (b *Builder) WriteString(s string) (int, error) {b.copyCheck()b.buf = append(b.buf, s...)return len(s), nil
}

【Golang源码阅读】strings/builder.go相关推荐

  1. golang源码阅读-net.Dial

    1.基本使用 //获取链接 conn, err := net.Dial("tcp", "0.0.0.0:8080")if err != nil {fmt.Pri ...

  2. Golang源码阅读笔记 - String

    String用法说明 在src/buildin/buildin.go文件中,对golang内建数据类型做了详细的描述,关于string的说明如下: // string is the set of al ...

  3. 【Golang源码阅读】builtin/builtin.go

    // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...

  4. strings.Builder 源码阅读与分析

    strings.Builder源码阅读与分析 背景之字符串拼接 在 Go 语言中,对于字符串的拼接处理有很多种方法,那么那种方法才是效率最高的呢? str := []string{"aa&q ...

  5. Golang流媒体实战之六:lal拉流服务源码阅读

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos <Golang流媒体实战>系列的链接 体验 ...

  6. Golang流媒体实战之五:lal推流服务源码阅读

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos <Golang流媒体实战>系列的链接 体验 ...

  7. syzkaller 源码阅读笔记1(syz-extract syz-sysgen)

    文章目录 1. syz-extract 1-0 总结 1-1. `main()` 1-2 `archList()` - `1-1 (3)` 获取架构 name list 1-3 `createArch ...

  8. android tcp socket框架_最流行的 Web 框架 Gin 源码阅读

    最近公司大部分项目开始往golang换, api的框架选定使用gin, 于是将 gin的源码看了一遍, 会用几篇文章将gin的流程及流程做一个梳理, 下面进入正题. gin框架预览 上图大概是 gin ...

  9. mybatis源码阅读(二):mybatis初始化上

    转载自  mybatis源码阅读(二):mybatis初始化上 1.初始化入口 //Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与 ...

最新文章

  1. java触发_怎么样让JAVA 设置一秒钟触发一个事件
  2. 软件开发环境-过程控制和消息服务器
  3. 统计学中的自由度 Degrees of freedom (statistics)
  4. __attribute__函数的作用
  5. RabbitMQ脑裂
  6. 项目管理(5):备战pmp
  7. 使用 keytool 生成安卓应用程序签名
  8. 【OS学习笔记】十五 保护模式三:保护模式下的内存访问机制
  9. C++ 之编程语法习惯之 do{...}while(0) 的用处
  10. 新春牛年迎春PSD分层模板!最全设计素材都在这了
  11. SLAM--Pangolin显示相机位姿
  12. PMBOK第六版学习笔记
  13. html表格的基础知识及源代码-尚硅谷
  14. ios极光推送 App收到推送消息时,修改BadgeNumber,同时点击状态栏消息以后跳到指定的页面和静默推送
  15. 阿里云大数据助理工程师ACA认证最新笔记(2021)
  16. 苹果电脑python快捷键_我常用用的MAC快捷键和手势
  17. 无线电视服务器主机名,电视服务器主机名怎么填
  18. 常用加密与解密算法示例代码
  19. 第3章 Pandas数据处理(3.7-3.8)_Python数据科学手册学习笔记
  20. 脑波设备mindwave介绍

热门文章

  1. wget 和scp对比_如何下载scp、wget、inotify及如何偷包
  2. 从还珠格格到延禧攻略,不变的是什么?
  3. GBASE 8s 物理日志缓冲区(Physical-log buffer)
  4. Linux这些年经历了什么?
  5. java毕业设计网站SpringBoot美容院预约管理系统
  6. 错误页面不暴漏,显示到一个漂亮页面
  7. 关于自己配置电脑的一点心得
  8. 温度报警器 c语言,红外遥控温度报警器
  9. CTO 说公司的 ES 性能不够好、集群不够稳定!直到我用了这些调优技巧后。。。...
  10. 火车WiFi春天已到来?