Go 的 strings.Builder 实战:拼接性能、Grow 预分配与何时该用 bytes.Buffer
Go 的 strings.Builder 实战:拼接性能、Grow 预分配与何时该用 bytes.BufferGo 里拼字符串,新手第一反应是,循环几万次后 CPU 和内存双双爆表。老手会甩一句「用 strings.Builder」,但很少讲清楚它为什么快、Grow 有什么用、什么时候反而该用 bytes.Buffer。这篇用能跑的代码说明白。为什么 在循环里是灾难Go 的 string 是不可变的。s x每次都要新分配一块内存,把旧内容和新内容拷过去,旧的等着被 GC。循环 N 次就是 O(N²) 的拷贝量:// 反例:每次 都重新分配 拷贝,循环越长越慢funcjoinBad(parts[]string)string{s:for_,p:rangeparts{sp// 每轮生成一个新 string}returns}一万个短字符串就能让它比正确写法慢几十倍,而且制造大量临时垃圾。strings.Builder:一块可扩展的缓冲区strings.Builder内部维护一个[]byte,WriteString直接往后追加,只在容量不够时才扩容,最后String()零拷贝地把 buffer 转成 string:funcjoinGood(parts[]string)string{varb strings.Builderfor_,p:rangeparts{b.WriteString(p)// 追加到内部 []byte,不重新分配整串}returnb.String()// 底层数组直接转 string,不拷贝}String()之所以能零拷贝,是因为 Builder 用了unsafe把[]byte直接转成 string,并且禁止拷贝自身(拷贝会触发 panic,防止两个 Builder 共享同一底层数组)。所以别值传递 Builder,要传就传指针。Grow:提前知道总长度就一次性分配即便有 Builder,如果不预分配,它仍会在扩容时多次 realloc。当你能估算最终长度时,用Grow(n)一次性把容量备好,彻底消灭中途扩容:funcjoinFast(parts[]string)string{total:0for_,p:rangeparts{totallen(p)}varb strings.Builder b.Grow(total)// 一次分配到位,后续 Write 不再扩容for_,p:rangeparts{b.WriteString(p)}returnb.String()}用go test -bench实测,joinFast通常比不 Grow 的版本少一半以上的内存分配次数(allocs/op)。拼接大量数据时,Grow 是性价比最高的一行优化。strings.Builder vs bytes.Buffer 怎么选两者都是可扩展缓冲区,区别在用途:最终要 string,而且只往里写→strings.Builder。它的String()零拷贝,更省。需要读回来(实现 io.Reader)、或要反复 Reset 复用、或最终要 []byte→bytes.Buffer。Builder 没有读接口,Bytes()也没有。// bytes.Buffer 能当 io.Reader/Writer 用,还能 Reset 复用varbuf bytes.Buffer buf.WriteString(hello)io.Copy(os.Stdout,buf)// Builder 做不到:它不是 Reader一句话:纯拼字符串用 Builder,要参与 IO 流或需要读取用 Buffer。注意bytes.Buffer.String()是有拷贝的,别为了「拼个字符串」平白多一次拷贝。一个常被忽略的点:Builder 也能 fmt不想手动拼格式化字符串时,fmt.Fprintf可以直接往 Builder 写,避免生成中间 string:varb strings.Builderfori,p:rangeparts{fmt.Fprintf(b,%d:%s;,i,p)// 直接写进 Builder,无中间字符串}小结循环里是 O(N²) 拷贝,数据量一大就崩;拼字符串默认上strings.Builder。String()零拷贝,但 Builder禁止值拷贝,传参用指针。能估算长度就Grow(total)一次分配到位,实测能砍掉一半以上的allocs/op。选型记忆点:只写、最终要 string 用 Builder;要读回来/复用/输出 []byte 用 bytes.Buffer。

相关新闻

windows11自动更新解决

windows11自动更新解决

目录 一、WinR: 二、找到如下路径: 三、之后新建文件: 四、结果: 一、WinR: 开始操作之前 需知晓 Windows 11 25H2 版本后可能不再适用,以下可参考 输入redegit打开注册表编辑器 二、找到如下路径&am…

2026/10/13 16:23:24 阅读更多 →
深度解析WinFSP:在Windows上打造用户模式文件系统的实战指南

深度解析WinFSP:在Windows上打造用户模式文件系统的实战指南

深度解析WinFSP:在Windows上打造用户模式文件系统的实战指南 【免费下载链接】winfsp Windows File System Proxy - FUSE for Windows 项目地址: https://gitcode.com/gh_mirrors/wi/winfsp Windows 上写文件系统,长期以来是内核程序员才敢碰的领…

2026/10/11 8:50:26 阅读更多 →
如何选择福建的压片糖果代工工厂?

如何选择福建的压片糖果代工工厂?

如何选择福建的压片糖果代工工厂?大家好,我是周夫人,深耕压片糖果领域已经五年了。今天想和大家聊聊如何在福建选择一家靠谱的压片糖果代工工厂。毕竟,选择一个好的合作伙伴对品牌的发展至关重要。行业深度观察压片糖果市场近年来…

2026/10/10 22:05:50 阅读更多 →

最新新闻

易助8.0表结构解析:数据库设计快照的读取、重建与业务反推

易助8.0表结构解析:数据库设计快照的读取、重建与业务反推

简介:本资源为易助ERP系统8.0版本的完整数据库表结构文档集,面向ERP系统二次开发人员、SQL数据库工程师及企业信息化实施顾问,用于快速理解核心业务模块的数据建模逻辑与字段语义。压缩包内含1163个文件,主体为1124个XML格式的表结…

2026/10/14 7:00:33 阅读更多 →
PS5全场景增强方案:M.2扩容、远程串流与系统设置全攻略

PS5全场景增强方案:M.2扩容、远程串流与系统设置全攻略

“AnyPS5”是我最近一直在整理的一套围绕PS5游戏主机的全场景使用增强方案。它不是一个破解工具,也不是什么改装套件,而是一份把官方硬件能力和系统功能全部吃透的折腾笔记。我所做的事很简单:把PS5从开箱、扩容、联网、串流、外设匹配到日常…

2026/10/14 7:00:33 阅读更多 →
AnyPS5项目解析:从命名歧义看PS5相关技术工具的定义边界

AnyPS5项目解析:从命名歧义看PS5相关技术工具的定义边界

项目标题为“AnyPS5”,但提供的输入内容中,项目正文为空、关键词未给出、摘要描述缺失,且网络搜索部分仅显示空代码块(),无任何实质性信息支撑。在严格遵循你设定的全部创作原则与安全红线的前提下&#xf…

2026/10/14 7:00:33 阅读更多 →
Vue 3进阶:Composition API、Teleport与Suspense实战解析

Vue 3进阶:Composition API、Teleport与Suspense实战解析

如果你正在按学习计划推进 Vue 3,走到“第 59 天”这个节点,大概率已经开始接触 Composition API 了。我从 Vue 2 切到 Vue 3 时,最先的感受不是新语法多,而是旧习惯全在被挑战——选项式写法里那种“数据归数据、方法归方法”的舒…

2026/10/14 7:00:33 阅读更多 →
端到端自动驾驶工程落地四大核心:模型×数据×训练×平台

端到端自动驾驶工程落地四大核心:模型×数据×训练×平台

1. 这不是“自动驾驶论文合集”,而是一份可落地的工程路线图很多人看到“端到端自动驾驶”第一反应是:又一篇堆砌Transformer、BEV、Occupancy的综述?或者干脆划走——觉得离量产太远,全是实验室玩具。我完全理解这种反应。过去三…

2026/10/14 7:00:33 阅读更多 →
LoadRunner 12录制+11压测:APP后端并发测试实战指南

LoadRunner 12录制+11压测:APP后端并发测试实战指南

简介:这份资源面向移动端性能测试工程师与后端开发人员,聚焦APP后台服务器的压力测试场景,解决LoadRunner无法直接录制手机APP脚本的痛点。核心思路是借助LoadRunner12的代理录制能力抓取APP请求,再将调试好的脚本放到LoadRunner1…

2026/10/14 6:59:33 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →