golang字符串拼接方式
字符串拼接是字符的常见操作。在golang中,遇见了字符串拼接。作为一个长期的C程序员,我第一反应是:字符串拼接函数strcat,但发现golang并无字符串拼接函数。
我想起了最简单的方法,通过+操作符进行字符串拼接。
但我查了相关资料后发现:golang中的string类型也是只读且不可变的;因此,这种拼接字符串的方式会导致大量的string创建、销毁和内存分配。如果你拼接的字符串比较多的话,这显然不是一个正确的姿势。
然后,查找一些可行的方法。
(1)fmt.Sprintf():该方法内部使用 []byte 实现,不像直接运算符这种会产生很多临时的字符串,但是内部的逻辑比较复杂,有很多额外的判断,还用到了 interface,所以性能也不是很好。
(2)strings.Join():join会先根据字符串数组的内容,计算出一个拼接之后的长度,然后申请对应大小的内存,一个一个字符串填入,在已有一个数组的情况下,这种效率会很高,但是本来没有,去构造这个数据的代价也不小
(3)buffer.WriteString():可以当成可变字符使用,对内存的增长也有优化,如果能预估字符串的长度,还可以用 buffer.Grow() 接口来设置 capacity
(4)strings.Builder:golang拼接倡导的方法。
倡导尽量用strings.Builder方法,示例如下;
var build strings.Builder
build.WriteString("http://www.your_dsp.com/win?sid=")
build.WriteString(dsp.RequestId)
build.WriteString("&impid=")
build.WriteString(dsp.ImpInfo.Impid)
build.WriteString("&price={")
build.WriteString(fmt.Sprintf("%d", rsp.Bid.Price))
build.WriteString("}")
fmt.Println(build.String())
测试:
我自己写了个程序测试,发现:测试次数越大,fmt.Sprintf 的时间差距与strings.Builder的差距越大,代码如下:
func main(){_, miniute, _ := time.Now().Clock()var dsp DspInfo = DspInfo{"91b5e18c-014c-1000-e71a-3e9942b60043","91b5e18c-014c-1000-e71a-3e9942b60043",time.Now().Format("2006010215"),int32(miniute),"5d0861a92e5f930fe8a66025"}i := 0t1 := time.Now().UnixNano()for i < 10000000 {//combineURL("win" , &dsp, 100)var build strings.Builderbuild.WriteString("http://www.dsp.com")build.WriteString("/")//build.WriteString("http://www.dsp.com/")build.WriteString("win")build.WriteString("?sid=")build.WriteString(dsp.RequestId)build.WriteString("&impid=")build.WriteString(dsp.ImpId)//build.WriteString("&price={PRICE}&extdata=")build.WriteString("&price={PRICE}")build.WriteString("&extdata=")build.WriteString(dsp.TimeHour)build.WriteString(strconv.FormatInt(int64(dsp.Miniute), 10))build.WriteString("_")build.WriteString(dsp.MmId)build.String()i++}t2 := time.Now().UnixNano()i = 0t3 := time.Now().UnixNano()for i < 10000000 {fmt.Sprintf("http://www.dsp.com/%s?sid=%s&impid=%s&price={PRICE}&extdata=%s%d_%s","win", dsp.RequestId, dsp.ImpId, dsp.TimeHour, dsp.Miniute,dsp.MmId)i++}t4 := time.Now().UnixNano()i = 0t5 := time.Now().UnixNano()for i < 10000000 {var buff bytes.Buffer// 向buff中写入字符/字符串buff.Write([]byte("http://www.dsp.com/"))buff.WriteString("win")buff.WriteString("?sid=")buff.WriteString(dsp.RequestId)buff.WriteString("&impid=")buff.WriteString(dsp.ImpId)buff.WriteString("&price={PRICE}")buff.WriteString("&extdata=")buff.WriteString(dsp.TimeHour)buff.WriteString(strconv.FormatInt(int64(dsp.Miniute), 10))buff.WriteString("_")buff.WriteString(dsp.MmId)buff.String()i++}t6 := time.Now().UnixNano()fmt.Println(t1, "\n", t2, "\n", t3, "\n", t4, "\n", t5, "\n", t6)fmt.Println("delta T1: ", t2 - t1, "\ndelta T2:", t4 - t3, "\ndelta T3:", t6 - t5)}
golang字符串拼接方式相关推荐
- golang 字符串拼接方式
最近在做性能优化,有个函数里面的耗时特别长,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其实有很多种实现. 实现方法 1.直接使用运算符 func BenchmarkAd ...
- 用数据说话,Go 所有字符串拼接方式里哪种才是最稳定高效的?
前言 日常业务开发中离不开字符串的拼接操作,不同语言的字符串实现方式都不同,在Go语言中就提供了6种方式进行字符串拼接,那这几种拼接方式该如何选择呢?使用那个更高效呢?今天我们邀请到公众号「Golan ...
- 将页面多个下拉框的值以字符串拼接方式存放至数据库一个字段中
1,当页面中有多个值,传入Controller并以字符串拼接方式,以","隔开存放至数据库一个字段中,页面中多个<select name="off"&g ...
- 选择合适的 Go 字符串拼接方式
前言 哈喽,大家好,我是asong 日常业务开发中离不开字符串的拼接操作,不同语言的字符串实现方式都不同,在Go语言中就提供了6种方式进行字符串拼接,那这几种拼接方式该如何选择呢?使用那个更高效呢?本 ...
- Go字符串拼接方式深入比较
前言 Go中字符串的拼接主要有"+".fmt.Sprintf+%s.strings.Join等方式,已经有很多人从耗时的角度比较这些方式的性能,本文则从源码的角度去分析下这些方式的 ...
- Golang字符串拼接的方法
Golang字符串拼接的方法 three := []string{"a", "b1"}four := []string{"c01", &qu ...
- Golang字符串拼接
Golang字符串拼接 Golang中字符串的拼接存在很多种方法,性能也存在明显的差异.考虑一种场景,需要连续地拼接大量字符串. 不同字符串拼接的性能对比 采用操作符+拼接 func Benchmar ...
- C# 字符串拼接整理_C#字符串拼接方式整理
C# 字符串拼接整理_C#字符串拼接方式整理 一.字符串连接使用+ 注意:此方式多种语言通用,js,java中都可以如此操作 string hello = "Hello"; st ...
- Golang的五种字符串拼接方式
1.+号 func main() {s1 := "hello"s2 := "word"s3 := s1 + s2fmt.Print(s3) //s3 = &qu ...
最新文章
- opensuse 安装 php,在openSUSE上安装和配置LAMP(2)
- TypeScript 2.1中的类型运算 一个递归的Readonly泛型
- 记一次线上商城系统高并发的优化
- SD-关于定价日期的设置
- Weblogic 12c中修改SERVER NAME的方法
- 获取Spring的ApplicationContext的几种方式
- css控制页面文字不能被选中user-select:none;
- 前端学习(3320):undefine和null 2
- PHPer转战Android的学习过程以及Android学习
- 怎样清除手机中的html文件夹,怎么彻底清除手机APP卸载后的残留文件夹 能删与不能删文件名...
- C语言SetConsoleCursorPosition()函数来定位光标位置
- 字符串解压缩c语言除哈夫曼,C语言实现压缩二例(示例代码)
- python 之发送邮件服务[原著] 海瑞博客
- 使用 Learner Lab - 使用 API Gateway 与 Lambda 上传图片到 S3
- 电信增值短信平台模块清单(100万级)
- ctf.show的JWT(web345-web350)
- [深度学习] (sklearn)多层感知机对葡萄酒的分类
- GitHub 项目徽章的添加和设置
- 定义商品类Goods 并进行封装
- HNUST 挑战ACM迷宫(DFS)