我认真撸了一把Go语言的字符串拼接

大家好,我是:猿谋人

』。今天来和大家聊聊 Go语言 里的字符串拼接问题。

也许在你开发第一个 Go语言 项目时,你并不会太在意这个问题。那当你在开始写第二个、第三个项目时呢?

本着程序猿天生的钻牛角尖钻到死的精神,或许你会问:哪种字符串拼接更高效一些呢?那么今天带大家一探究竟。

常用拼接方式

fmt.Sprintf() 函数直接字符串拼接符号:+bytes.Buffer 和 strings.Builder

fmt.Spintf 函数

如上三种便是在日常开发中常用字符串拼接方式,我们将对这三种不同的方式编写不同的 benchmark 测试,这里不得不的说的是,在 Go语言 中做测试是非常方便的,我们只需要创建一个以 _test 结尾的 go文件即可:concat_test.go

Go语言中,fmt 包被用来格式化标准输出的包,包中 Sprintf 函数将根据我们传入的不同参数类型配置,并返回格式化后的字符串。我们之所以要测试该函数,是因为我们经常使用此函数来做字符串拼接,并且自动转换不同数据类型。

在这里我们编写了一个 BenchmarkPrint 函数(Go语言规定,基准测试的函数必须以 Benchmark 开头),b.N 是 Go benchmark 内置变量,代表会循环 N 次,这个 N 具体取值由运行环境本身决定,我们不需要关心。

在这里,为了模拟常规的字符串拼接行为,我传入一个整数:2020,一个字符串:新年快乐

一个字符串拼接涉及不同数据类型的值拼接是非常常见的。

使用字符串拼接符号:+

使用 + 符号也是家常便饭,不妨看看这种性能如何。

在这里我编写了两个测试函数,一个是分三次赋值并拼接字符串,一个是一次性完成三次拼接,待会儿你会看到这两种方式会有意想不到的性能差别。

bytes.Buffer 和 strings.Builder

Go语言中内置了两种字符串拼接方式:bytes.Buffer 和 strings.Builder 在Go 1.10 之前只有 bytes.Buffer ,从 Go 1.10 开始新增了 strings.Builder 旨在替换 bytes.Buffer

不妨,我们也给出这两种拼接方式的性能测试结果。

测试结果

当前测试使用go语言版本:go 1.13.1

使用 fmt.Sprintf 函数和 + 符号拼接性能接近。+ 符号多次赋值拼接和一次性拼接性能差距很大,3倍差距。内置 bytes.Buffer 性能是前两种的1.5倍左右。