Goで文字列を連結したい場合、複数のやり方があるがパフォーマンスの良し悪しが関連してくる。

どの言語でも使われる + で連結するのはコスト効率が悪いので大量に処理する時には向かないようだ。以下のコードでは(4)〜(6)の方式が性能的に効率がいいらしい。ま、ちょろっとした処理なら(1)や(2)でいいっしょ、て思うけど。(7)はオマケ的なやつ。

 

append_str.go

package main

import (
    "fmt"
    "strings"
    "bytes"
)

func main() {

    //(1) +で連結する
    name1 := "Quentin" + " " + "Tarantino"
    fmt.Println(name1)
    
    //(2) fmtパッケージのprint関数では引数の複数文字列を自動的に連結する。
    fmt.Println("Pulp", "Fiction")
    
    //(3) stringsパッケージのjoin()関数を使う
    sampleSlice := []string{"Directed", "by", "Quentin", "Tarantino"}
    result := strings.Join(sampleSlice, " ")
    fmt.Println(result)
    
    //(4) バイトバッファによる文字列連結
    var sample bytes.Buffer
    
    sample.WriteString("Martin ")
    sample.WriteString("Scorsese")
    
    fmt.Println(sample.String())
    
    //(5) strings Builderメソッドによる文字列連結
    var sb strings.Builder
    
    sb.WriteString("Taxi ")
    sb.WriteString("Driver")
    
    fmt.Println(sb.String())
    
    //(6) []byte型の値に文字列を足していって連結
    
    b := make([]byte, 0, 10)  //サイズ0、内部バッファの長さ10byteの割り当て
    
    b = append(b, "Directed "...)
    b = append(b, "by "...)
    b = append(b, "Martin "...)
    b = append(b, "Scorsese"...)
    
    fmt.Println(string(b))
    
    fmt.Println("...")
    
    //(7) 文字列繰り返し
    fmt.Println(strings.Repeat("Blah ", 3))

}

 

結果

Quentin Tarantino
Pulp Fiction
Directed by Quentin Tarantino
Martin Scorsese
Taxi Driver
Directed by Martin Scorsese
...
Blah Blah Blah 

 

参考
Golangで文字列を連結する7つの方法 (いろいろ紹介してくれてるけど動作しないコードがあった…)
Goでは文字列連結はコストの高い操作 ([]byte例)
Go言語で効率良く文字列を連結する話 #golang (bytes.Buffer例)

 

 

Metro


関連がありそうな記事