golang?字符串拼接方法對(duì)比分析
字符串拼接
字符串拼接有以下幾種方法
- 加號(hào)+
- fmt.Sprintf
- strings.Join
- bytes.Buffer
- strings.Builder 此方法為官方推薦
新建單元測(cè)試文件string_test.go
package test
import (
"bytes"
"fmt"
"strings"
"testing"
)
func BenchmarkFmtSprintf(b *testing.B) {
for i := 0; i < b.N; i++ {
s := fmt.Sprintf("%s%s", "abcdefghijklmnopqrstuvwxyz", "123456789")
fmt.Errorf(s)
}
}
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
s := "abcdefghijklmnopqrstuvwxyz" +"123456789"
fmt.Errorf(s)
}
}
func BenchmarkStringsJoin(b *testing.B) {
for i := 0; i < b.N; i++ {
s := strings.Join([]string{"abcdefghijklmnopqrstuvwxyz","123456789"}, "")
fmt.Errorf(s)
}
}
func BenchmarkBuffer(b *testing.B) {
for i := 0; i < b.N; i++ {
buf := bytes.Buffer{}
buf.WriteString("abcdefghijklmnopqrstuvwxyz")
buf.WriteString("123456789")
fmt.Errorf(buf.String())
}
}
func BenchmarkBuilder(b *testing.B) {
for i := 0; i < b.N; i++ {
builder := strings.Builder{}
builder.WriteString("abcdefghijklmnopqrstuvwxyz")
builder.WriteString("123456789")
fmt.Errorf(builder.String())
}
}執(zhí)行
go test string_test.go -benchmem -bench=".*"
結(jié)果:
BenchmarkFmtSprintf-4 2962962 400.6 ns/op 112 B/op 3 allocs/op
BenchmarkAdd-4 6629833 207.7 ns/op 64 B/op 2 allocs/op
BenchmarkStringsJoin-4 4255318 291.6 ns/op 112 B/op 3 allocs/op
BenchmarkBuffer-4 2948402 368.3 ns/op 176 B/op 4 allocs/op
BenchmarkBuilder-4 3149605 352.1 ns/op 160 B/op 4 allocs/op
PASS
ok command-line-arguments 8.219s
執(zhí)行效率排序+>join>fmt.Sprintf>strings.Builder>bytes.Buffer
新建單元測(cè)試文件string2_test.go
package test
import (
"bytes"
"fmt"
"strings"
"testing"
)
func BenchmarkAdd2(b *testing.B) {
s:= "abcdefghijklmnopqrstuvwxyz"
for i := 0; i < b.N; i++ {
s += "abcdefghijklmnopqrstuvwxyz"
}
fmt.Errorf(s)
}
func BenchmarkBuffer2(b *testing.B) {
buf := bytes.Buffer{}
for i := 0; i < b.N; i++ {
buf.WriteString("abcdefghijklmnopqrstuvwxyz")
}
fmt.Errorf(buf.String())
}
func BenchmarkBuilder2(b *testing.B) {
builder := strings.Builder{}
for i := 0; i < b.N; i++ {
builder.WriteString("abcdefghijklmnopqrstuvwxyz")
}
fmt.Errorf(builder.String())
}執(zhí)行
go test string2_test.go -benchmem -bench=".*"
結(jié)果:
goos: windows
goarch: amd64
cpu: Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz
BenchmarkAdd2-4 10000 101400 ns/op 133806 B/op 1 allocs/op
BenchmarkBuffer2-4 15974260 79.25 ns/op 145 B/op 0 allocs/op
BenchmarkBuilder2-4 17142856 59.38 ns/op 189 B/op 0 allocs/op
PASS
ok command-line-arguments 4.912s
執(zhí)行效率排序:strings.Builder>bytes.Buffer>加號(hào)
且strings.Builder和bytes.Buffer分配內(nèi)存大小和次數(shù),要比加號(hào)效率更好
總結(jié)
由此可知在不同的使用場(chǎng)景,應(yīng)使用不同的拼接方法,在一些簡(jiǎn)單的拼接字符串里使用加號(hào)簡(jiǎn)單高效,在復(fù)雜的拼接場(chǎng)景推薦strings.Builder和bytes.Buffer。
以上就是golang 字符串拼接方法對(duì)比分析的詳細(xì)內(nèi)容,更多關(guān)于golang 字符串拼接的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一篇文章帶你搞懂Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)Time
在我們開(kāi)發(fā)的過(guò)程中,每個(gè)項(xiàng)目都需要時(shí)間這一類(lèi)的函數(shù),此時(shí)對(duì)time這個(gè)包的研究深度就顯得尤為重要,這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章帶你搞懂Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)Time的相關(guān)資料,需要的朋友可以參考下2022-10-10
淺析Go語(yǔ)言如何避免數(shù)據(jù)競(jìng)爭(zhēng)Data?Race和競(jìng)態(tài)條件Race?Condition
在并發(fā)編程中,數(shù)據(jù)競(jìng)爭(zhēng)?(Data?Race)?和?競(jìng)態(tài)條件?(Race?Condition)?是兩個(gè)常見(jiàn)的問(wèn)題,本文將簡(jiǎn)單介紹一下二者如何避免,有需要的可以了解下2025-01-01
golang使用tail實(shí)現(xiàn)追蹤文件變更
這篇文章主要為大家介紹了golang如何借助 github.com/hpcloud/tail ,實(shí)現(xiàn)實(shí)時(shí)追蹤文件變更,達(dá)到類(lèi)似shell命令tail -f的效果,感興趣的小伙伴可以了解一下2023-08-08
淺析go中Ticker,Timer和Tick的用法與區(qū)別
在go面試的時(shí)候,面試官經(jīng)常會(huì)問(wèn)time包的Ticker,Timer以及Tick的區(qū)別,一般在超時(shí)控制的時(shí)候用的比較多,今天就跟隨小編一起來(lái)詳細(xì)學(xué)一下這幾個(gè)的區(qū)別吧2023-10-10
Go 實(shí)現(xiàn)一次性打包各個(gè)平臺(tái)的可執(zhí)行程序
這篇文章主要介紹了Go 實(shí)現(xiàn)一次性打包各個(gè)平臺(tái)的可執(zhí)行程序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Gin 路由與路由文件分組的實(shí)現(xiàn)實(shí)例
本文主要介紹了Gin 路由與路由文件分組的實(shí)現(xiàn)實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-11-11
Go語(yǔ)言七篇入門(mén)教程三函數(shù)方法及接口
這篇文章主要為大家介紹了Go語(yǔ)言的函數(shù)方法及接口的示例詳解,本文是Go語(yǔ)言七篇入門(mén)系列文章,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11

