Go的string与strings.Builder
Go的string与strings.Builder
文章目录
- Go的string与strings.Builder
- 一、strings.Builder 的优势
- 二、string类型的值
- 三、与string相比,Builder的优势体现在拼接方面
- 3.1 Builder的拼接,与Builder的自动扩容
- 3.2 手动扩容
- 3.3 Builder 的重用
- 四、strings.Builder的使用约束
- 五、strings.Reader 类型的值可以高效读取字符串
一、strings.Builder 的优势
- 以存在的内容不可变,但可以拼接更多的内容;
- 减少了内存分配和内存拷贝的次数;
- 可将可容重叠,可重用值;
二、string类型的值
在Go语言中,string类型的值是不可变的。
基于原字符串的裁剪和拼接操作:
- 裁剪操作可以使用切片表达式;
- 拼接操作可以使用操作符+实现;
一个string的内容会被存储在一块连续的内存空间中,这个连续空间的字节数量也会被记录下来,并用于表示该string值的长度。
对string类型的值,执行len() 方法,得到的是字节的数量。
var str01 stringstr01 = "Go,你好"// len(string) : 11fmt.Printf("len(string) : %v \n", len(str01))// len([]char): 5fmt.Printf("len([]char): %v\n", len([]rune(str01)))// len([]byte): 11fmt.Printf("len([]byte): %v\n", len([]byte(str01)))
对string类型的值,进行切片操作,相当于对底层的字节数组做切片
// 在string类型的值上进行切片操作,相当于对底层的字节数组做切片fmt.Println(str01[0:3]) // Go�fmt.Println(str01[0:5]) // Go,
在执行字符串拼接的时候,会把所有被拼接的字符串依次拷贝到一个崭新且足够大的连续内存空间中,并把相应指针指的string值作为结果返回。
三、与string相比,Builder的优势体现在拼接方面
与string相比,strings.Builder 的优势最要体现在字符串拼接方面。
Builder有一个内容容器,它是一个以byte为元素类型的切片(简称字节切片)。
Builder类型的值只能被拼接或完全覆盖。
3.1 Builder的拼接,与Builder的自动扩容
可以通过Write、WriteByte、WriteRune、WriteString方法,把新的内容拼接到已存在的内容的尾部。
Builder会自动地对自身的内容容器进行扩容。扩容策略与切片的扩容策略一致。
3.2 手动扩容
Builder的值还可以手动扩容,通过调用Builder的Grow方法,就可以做到。
Grow方法接受一个int类型的参数n,这个参数表示要扩充的字节数量。
如果未用容量大于或等于n,Grow方法可能什么都不做。
3.3 Builder 的重用
通过调用Reset方法,可以让Builder值重新回到零值的状态,就像它从未被使用一样。
四、strings.Builder的使用约束
- springs.Builder 类型的值在已被真正使用后,就不可再被复制。
- 由于其内容不是完全不可变的,需要使用方自行解决操作冲突和并发安全的问题。
只要调用了Builder值的拼接或扩容方法,就意味着真正使用。一旦真正使用,Builder值就不能被复制,否则调用副本的方法会引起panic。
var sb01 strings.Buildersb01.WriteString("Go")sb02 := sb01// sb02.Grow(1) // 这里会引起恐慌panic_ = sb02
虽然Builder值不可复制,但是它的指针指却可以复制。复制的指针值会指向同一个Builder值。
对于处于零值状态的Builder值,复制不会有任何问题。所以,只要在传递之前调用Reset方法即可。
var sb01 strings.Buildersb01.WriteString("Go")sb01.Reset()sb03 := sb01sb03.Grow(1)
五、strings.Reader 类型的值可以高效读取字符串
strings.Reader 类型的值,可以让我们很方便的读取一个字符串中的内容。因为,在读取的过程中,Reader值会保存已读取的字节的计数。
一读计数代表着下次读取的起始索引位置。
Reader 正是依靠这样的一个计数,以及针对字符串的切片表达式,从而实现快读读取。
通过Len方法和Size方法获取已读计数:
var reader1 strings.Readerreader1 = *strings.NewReader("Go, 你好")ch, size, err := reader1.ReadRune()fmt.Printf("%v, %v, %v\n", string(ch), size, err)readingIndex := reader1.Size() - int64(reader1.Len())fmt.Printf("以读计数:%v\n", readingIndex)
Reader 的Seek方法用于设定下一次读取的起始索引位置;如果把io.SeekCurrent 的值作为第二个参数值传递给该方法。那么它会依据当前的已读计数,以及第一个参数offset的值来计算新的计数值。
相关文章:
Go的string与strings.Builder
Go的string与strings.Builder 文章目录Go的string与strings.Builder一、strings.Builder 的优势二、string类型的值三、与string相比,Builder的优势体现在拼接方面3.1 Builder的拼接,与Builder的自动扩容3.2 手动扩容3.3 Builder 的重用四、strings.Buil…...
8.Spring Security 权限控制
1.简介入门JavaEE和SpringMVC :Spring Security就是通过11个Fliter进行组合管理小Demouser实体类user.type字段,0普通用户,1超级管理员,2版主补全get set tostringimplement UserDetails,重写以下方法// true: 账号未过…...
curl / python+selenium爬取网页信息
Python爬取网页信息 需求: 持续爬取某嵌入式设备配置网页上的状态信息 shell脚本 简单快速, 不用装插件只能爬取静态内容 用curl命令返回整个网页的内容用grep命令抓取其中某些字段结合正则表达式可多样查找但对于动态内容, 比如对某嵌入式设备配置网页上的一条不断更新的信…...
晶体塑性有限元 Abaqus 三维泰森多边形(voronoi模型)插件 V7.0
1 上一版本完整功能介绍: Voronoi晶体插件-6.0版本[新功能介绍] 晶体塑性有限元 Abaqus 三维泰森多边形(voronoi模型)插件 V6.0 2 新增功能模块 7.0版本新增功能模块包括:柱状晶体模块和分层晶体模块。 2.1 二维柱状晶体模块 …...
CPython解释器性能分析与优化
原文来自微信公众号“编程语言Lab”:CPython 解释器性能分析与优化 搜索关注 “编程语言Lab”公众号(HW-PLLab)获取更多技术内容! 欢迎加入 编程语言社区 SIG-元编程 参与交流讨论(加入方式:添加文末小助手…...
Linux 进程:理解进程和pcb
目录一、进程的概念二、CPU分时机制三、并发与并行1.并发2.并行四、pcb的概念一、进程的概念 什么是进程? 进程就是进行中的程序,即运行中的应用程序。比如:电脑上打开的LOL、QQ…… 这些都是一个个的进程。 什么是应用程序? 应用…...
银行数字化转型导师坚鹏:招商银行数字化转型战略研究
招商银行数字化转型战略研究课程背景: 很多银行存在以下问题:不清楚如何制定银行数字化转型战略?不知道其它银行的数字化转型战略是如何演变的? 课程特色:用实战案例解读招商银行数字化转型战略。用独特视角解…...
java 一文讲透面向对象 (20万字博文)
目录 一、前言 二、面向对象程序设计介绍 1.oop三大特性 : 2.面向对象和面向过程的区别 : 3.面向对象思想特点 : 4.面向对象的程序开发 : 三、Java——类与对象 1.java中如何描述一个事物? 2.什么是类? 3.类的五大成员: 4.封装的前提——抽象 : 5.什么是对…...
使用file-selector-button美化原生文件上传
前言 你平时见到的上传文件是下面这样的? 还是下面这种美化过的button样式 还是下面这种复杂的上传组件。 <input type="file" >:只要指定的是type类型的input,打开浏览器就是上面第一种原生的浏览器默认的很丑的样式。 下面的两种是我从ElementUI截的图,…...
0402换元积分法-不定积分
文章目录1 第一类换元法1.1 定理11.2 例题1.2 常见凑微分形式1.2.1常见基本的导数公式的逆运算1.2.2被积函数含有三角函数2 第二类换元法2.1 定理22.2 常见第二换元代换方法2.2.1 三角代换-弦代换2.2.2 三角代换-切代换2.2.3 三角代换-割代换2.2.4 三角代换汇总2.2.5 倒代换2.2…...
信号类型(雷达)——脉冲雷达(三)
系列文章目录 《信号类型(雷达通信)》 《信号类型(雷达)——雷达波形认识(一)》 《信号类型(雷达)——连续波雷达(二)》 文章目录 前言 一、相参雷达 1…...
并查集(13张图解)--擒贼先擒王
目录 前言 故事 🌼思路 🌼总结 🌼代码 👊观察过程代码 👊正确代码 👊细节代码 来自《啊哈算法》 前言 刚学了树在优先队列中的应用--堆的实现 那么树还有哪些神奇的用法呢?我们从一…...
Flutter3引用原生播放器-IOS(Swift)篇
前言由于Flutter项目中需要使用到播放器功能,因此对flutter中各种播放器解决方案进行了一番研究和比对,最后决定还是自己通过Plugin的方法去引用原生播放器符合自己的需求,本篇文章会对各种解决方案做一个简单的比较,以及讲解一下…...
【蓝桥杯每日一题】双指针算法
🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙我与杀戮之中绽放,亦如黎明的花…...
拼数(一般贪心)
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题号:NC16783 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 设有n个正整…...
LeetCode 热题 C++ 169. 多数元素 10. 正则表达式匹配 155. 最小栈
力扣169 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3] 输出࿱…...
Clickhouse学习:MergeTree
MergeTree一、MergeTree逻辑存储结构二、MergeTree物理存储结构三、总结一、MergeTree逻辑存储结构 如上图所示,在排序键(CountrID、Date)上做索引,数据会按照这两个字段先后排序ClickHouse是稀疏索引,每隔8192行做一个索引,如(a,1),(a,2),比如想查a,要读取[0,3)之间的内容,稀疏…...
【java基础】包装类,自动装箱和自动拆箱
文章目录基本介绍包装类自动装箱自动拆箱包装类注意事项包装类比较包装器内容不可变基本介绍 有时,需要将int这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。 例如,Integer类对应基本类型int。通常,这些类称为包装器&#…...
Android笔记(二十五):两种sdk热更插件资源加载方案
背景 在研究sdk插件化热更新方式的过程中总结出了两套插件资源加载方案,在此记录下 资源热更方式 方式一:合并所有插件资源 需要解决资源id冲突问题 资源ID值一共4个字段,由三部分组成:PackageIdTypeIdEntryId PackageId&…...
spring框架--全面详解(学习笔记)
目录 1.Spring是什么 2.Spring 框架特点 3.Spring体系结构 4.Spring开发环境搭建 5.spring中IOC和DI 6.Spring中bean的生命周期 7.Spring Bean作用域 8.spring注解开发 9.Spring框架中AOP(Aspect Oriented Programming) 10.AOP 实现分类 11.A…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
