1. ホーム
  2. スクリプト・コラム
  3. ゴラン

Golangで文字列を効率的にスプライスする方法

2022-02-14 06:46:06

01. はじめに

プログラミング言語において、文字列は重要なデータ構造である。Golangでは、文字列はアクセスするだけで変更できないため、Golangで文字列のスティッチング操作を行う場合、メモリコピーが必要です。

読者の皆さんがGolang言語のメモリ管理についてご存じなら、メモリコピーがパフォーマンスを低下させることはご存知でしょう。Golangでは文字列を繋げる方法が複数あり、プログラムのパフォーマンス低下を抑えるために、それぞれの特徴を説明し、シナリオに応じて最適な文字列の繋ぎ方を選択できるようになることを目指します。

02. 演算子

演算子 + を使って文字列を縫合するのは、文字列を縫合する最も簡単な方法です。この方法は読みやすいのですが、ステッチのたびにメモリのコピーが発生し、新しいメモリを確保する必要があり、また文字列型の変数でしか動作しないため、性能は平均的です。したがって、この方法は、少数の文字列型の変数を文字列接続するようなシナリオに適しています。

コード例です。

str := "a" + "b" + "c"


03.文字列.Joinメソッド

標準ライブラリstringsのJoinメソッド。このメソッドは、string 型のスライスの各要素を文字列にスプライスする場合にのみ使用でき、string 型のスライス内の要素をスプライスするシナリオに適しています。

コード例です。

s := []string{"a", "b", "c"}
str := strings.Join(s, ", ")


04. fmt.Sprint メソッド

標準ライブラリfmtのSprint、Sprintf、Sprintlnメソッドも、文字列をスティッチする方法として比較的よく使われるものです。他の型をスティッチできること、型変換を伴うこと、基本的な実装では []byte byte スライシングを使うことが特徴ですが、性能は平凡なので、この方法は文字列スティッチのために他の非文字型変数が少数含まれるようなシナリオに適していると言えます。

コード例です。

str := fmt.Sprint("a", 1, "b\r\n")
str1 := fmt.Sprintf("name:%s,age=%d.\r\n", "lucy", 17)
str2 := fmt.Sprintln("a", 1, "b")


05. バイトのバッファタイプ

標準ライブラリバイトのバッファタイプは、このタイプのWriteStringメソッドとStringメソッドは、文字列のステッチを達成するために一緒に使用することができます、それは文字列、文字とUnicodeをステッチする機能によって特徴付けられる、基になる実装は[]バイトを使用しますが、文字列と[]バイト間の変換が含まれ、パフォーマンスが平均である、ので、The WriteStringメソッドがあまりにも長いバッファを使用して、パニックを引き起こすことができます文字変数と文字列変数数の少ないステッチングに適しています。

コード例です。

var b bytes.
b.WriteString("My ")
b.WriteString("name ")
b.WriteString("is ")
b.WriteString("lucy.")
str := b.String()


06.文字列.ビルダー型

標準ライブラリstringsのbuilder型。この型のWriteStringメソッドは、バイトと同様に文字列のスティッチングも可能なStringメソッドと連動しています。Pointerはstringと[]byte間の変換を最適化するので、大規模な文字列スティッチングのシナリオにおすすめです。

コード例です。

var b bytes.Builer
b.WriteString("My ")
b.WriteString("name ")
b.WriteString("is ")
b.WriteString("lucy.")
str := b.String()


07. 概要

今回は、Golang言語における5つの文字列スプライシング手法を紹介しましたが、読者の皆さんはそれぞれの手法がどのような場面で適しているのかを理解されたことと思います。最後に簡単なまとめをしておきます。

  • 演算子は、文字列型のみの少数の変数で、パフォーマンスが重要でないシナリオの場合に推奨されます。
  • 文字列をstring型のスライスで要素とスプライスする場合、strings.Joinメソッドを推奨します。
  • Sprintは、複数の型の変数を少数持つ文字列をスプライスする場合に推奨されます。
  • Buffer は、少数の文字列、文字、Unicode 文字列、およびパフォーマンスが重要な場合に推奨されます。
  • 文字列、文字、Unicodeの数が多い文字列をスプライシングする場合。文字列、文字、Unicodeの数が多く、パフォーマンスが重要な場合は、Bufferを推奨します。

Golangで文字列を効率的にスプライスする方法についてのこの記事はこれで終わりです。Golangで文字列を効率的にスプライスする方法については、Script Houseの過去の記事を検索するか、以下の記事を引き続きご覧ください。