大家好,我是:『猿谋人
也许在你开发第一个 Go语言 项目时,你并不会太在意这个问题。那当你在开始写第二个、第三个项目时呢?
本着程序猿天生的钻牛角尖钻到死的精神,或许你会问:哪种字符串拼接更高效一些呢?那么今天带大家一探究竟。
常用拼接方式
fmt.Sprintf() 函数直接字符串拼接符号:+bytes.Buffer 和 strings.Builderfmt.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