字符串拼接是字符的常见操作。在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字符串拼接方式相关推荐

  1. golang 字符串拼接方式

    最近在做性能优化,有个函数里面的耗时特别长,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其实有很多种实现. 实现方法 1.直接使用运算符 func BenchmarkAd ...

  2. 用数据说话,Go 所有字符串拼接方式里哪种才是最稳定高效的?

    前言 日常业务开发中离不开字符串的拼接操作,不同语言的字符串实现方式都不同,在Go语言中就提供了6种方式进行字符串拼接,那这几种拼接方式该如何选择呢?使用那个更高效呢?今天我们邀请到公众号「Golan ...

  3. 将页面多个下拉框的值以字符串拼接方式存放至数据库一个字段中

     1,当页面中有多个值,传入Controller并以字符串拼接方式,以","隔开存放至数据库一个字段中,页面中多个<select name="off"&g ...

  4. 选择合适的 Go 字符串拼接方式

    前言 哈喽,大家好,我是asong 日常业务开发中离不开字符串的拼接操作,不同语言的字符串实现方式都不同,在Go语言中就提供了6种方式进行字符串拼接,那这几种拼接方式该如何选择呢?使用那个更高效呢?本 ...

  5. Go字符串拼接方式深入比较

    前言 Go中字符串的拼接主要有"+".fmt.Sprintf+%s.strings.Join等方式,已经有很多人从耗时的角度比较这些方式的性能,本文则从源码的角度去分析下这些方式的 ...

  6. Golang字符串拼接的方法

    Golang字符串拼接的方法 three := []string{"a", "b1"}four := []string{"c01", &qu ...

  7. Golang字符串拼接

    Golang字符串拼接 Golang中字符串的拼接存在很多种方法,性能也存在明显的差异.考虑一种场景,需要连续地拼接大量字符串. 不同字符串拼接的性能对比 采用操作符+拼接 func Benchmar ...

  8. C# 字符串拼接整理_C#字符串拼接方式整理

    C# 字符串拼接整理_C#字符串拼接方式整理 一.字符串连接使用+  注意:此方式多种语言通用,js,java中都可以如此操作 string hello = "Hello"; st ...

  9. Golang的五种字符串拼接方式

    1.+号 func main() {s1 := "hello"s2 := "word"s3 := s1 + s2fmt.Print(s3) //s3 = &qu ...

最新文章

  1. opensuse 安装 php,在openSUSE上安装和配置LAMP(2)
  2. TypeScript 2.1中的类型运算 一个递归的Readonly泛型
  3. 记一次线上商城系统高并发的优化
  4. SD-关于定价日期的设置
  5. Weblogic 12c中修改SERVER NAME的方法
  6. 获取Spring的ApplicationContext的几种方式
  7. css控制页面文字不能被选中user-select:none;
  8. 前端学习(3320):undefine和null 2
  9. PHPer转战Android的学习过程以及Android学习
  10. 怎样清除手机中的html文件夹,怎么彻底清除手机APP卸载后的残留文件夹 能删与不能删文件名...
  11. C语言SetConsoleCursorPosition()函数来定位光标位置
  12. 字符串解压缩c语言除哈夫曼,C语言实现压缩二例(示例代码)
  13. python 之发送邮件服务[原著] 海瑞博客
  14. 使用 Learner Lab - 使用 API Gateway 与 Lambda 上传图片到 S3
  15. 电信增值短信平台模块清单(100万级)
  16. ctf.show的JWT(web345-web350)
  17. [深度学习] (sklearn)多层感知机对葡萄酒的分类
  18. GitHub 项目徽章的添加和设置
  19. 定义商品类Goods 并进行封装
  20. HNUST 挑战ACM迷宫(DFS)

热门文章

  1. 字母数字特殊字符部分unicode对照表
  2. 九万字图文讲透彻 Linux 电源管理及实例分析
  3. 实现轮播图,仅需3步
  4. 百度收录带www和不带www域名的不同和解决办法
  5. P1244 [NOI2000] 青蛙过河(普及-)
  6. 用html给一张图片做多个热区链接,html 锚点链接 图像热区链接
  7. linux网络编程--网络编程的基本函数介绍与使用【转】
  8. ubuntu使用docker-compose安装rabbitmq并实现延迟交换机
  9. 微信公众号开发之分享接口实现
  10. 好的家庭教育是什么样的?有智慧的家长都这样做