Goで文字列をフォーマットする方法
文字列は多くの場合、書かれたテキストで構成されているため、句読点、改行、インデントを使用して文字列を人間が読みやすくするために、文字列の外観をより細かく制御したい場合が多くあります。
このチュートリアルでは、Go文字列を操作して、すべての出力テキストが正しくフォーマットされていることを確認する方法をいくつか説明します。
文字列リテラル
まず、文字列リテラルと文字列値を区別しましょう。 文字列リテラルは、引用符を含め、コンピュータプログラムのソースコードに表示されるものです。 文字列値は、fmt.Println
関数を呼び出してプログラムを実行したときに表示される値です。
「Hello、World!」でプログラムでは、文字列リテラルは"Hello, World!"
ですが、文字列値は引用符なしでHello, World!
です。 文字列値は、Goプログラムを実行したときにターミナルウィンドウに出力として表示される値です。
ただし、ソースを引用する場合のように、一部の文字列値には引用符を含める必要がある場合があります。 文字列リテラルと文字列値は同等ではないため、文字列値が意図したとおりに表示されるように、文字列リテラルにフォーマットを追加する必要がある場合がよくあります。
引用
Go内で逆引用符(`
)または二重引用符("
)を使用できるため、逆引用符で囲まれた文字列内で二重引用符を使用すると、文字列内に引用符を簡単に埋め込むことができます。
`Sammy says, "Hello!"`
または、逆引用符を使用するには、文字列を二重引用符で囲むことができます。
"Sammy likes the `fmt` package for formatting strings.."
逆引用符と二重引用符を組み合わせる方法で、文字列内の引用符と逆引用符の表示を制御できます。
Goで逆引用符を使用するとraw
文字列リテラルが作成され、二重引用符を使用するとinterpreted
文字列リテラルが作成されることを覚えておくことが重要です。 違いの詳細については、Goチュートリアルでの文字列の操作の概要をお読みください。
エスケープ文字
文字列をフォーマットする別の方法は、エスケープ文字を使用することです。 エスケープ文字は、次の文字が特別な意味を持つことをコードに伝えるために使用されます。 エスケープ文字はすべて、バックスラッシュキー(\
)を文字列内の別の文字と組み合わせて開始し、指定された文字列を特定の方法でフォーマットします。
一般的なエスケープ文字のいくつかのリストを次に示します。
エスケープ文字 | フォーマット方法 |
---|---|
\\\\ | バックスラッシュ |
\\" | 二重引用符 |
\ n | 改行 |
\ t | タブ(水平インデント) |
上記の引用符の例にエスケープ文字を使用して引用符を追加しましょう。ただし、今回は二重引用符を使用して文字列を示します。
fmt.Println("Sammy says, \"Hello!\"")
OutputSammy says, "Hello!"
エスケープ文字\"
を使用することにより、二重引用符を使用して、二重引用符で囲まれたテキストを含む文字列を囲むことができます。
\n
エスケープ文字を使用すると、EnterキーまたはReturnキーを押さなくても行を区切ることができます。
fmt.Println("This string\nspans multiple\nlines.")
OutputThis string spans multiple lines.
エスケープ文字を組み合わせることもできます。 複数行の文字列を印刷し、項目別リストのタブ間隔を含めましょう。次に例を示します。
fmt.Println("1.\tShark\n2.\tShrimp\n10.\tSquid")
Output1. Shark 2. Shrimp 10. Squid
\t
エスケープ文字で提供される水平方向のインデントにより、前の例の2番目の列内での位置合わせが保証され、出力が人間にとって非常に読みやすくなります。
エスケープ文字は、文字列に追加の書式を追加するために使用されますが、これは実現が困難または不可能な場合があります。 エスケープ文字がないと、文字列Sammy says, "I like to use the `fmt` package"
を作成できません。
複数行
複数行に文字列を印刷すると、テキストが人間にとって読みやすくなります。 複数の行を使用すると、文字列をクリーンで整然としたテキストにグループ化したり、文字としてフォーマットしたり、詩や歌詞の改行を維持するために使用したりできます。
複数行にまたがる文字列を作成するには、文字列を囲むために逆引用符を使用します。 これにより行の戻り値は保持されますが、raw
文字列リテラルも作成されることに注意してください。
` This string is on multiple lines within three single quotes on either side. `
これを印刷すると、先頭と末尾にリターンがあることがわかります。
Output This string is on multiple lines within three single quotes on either side.
これを回避するには、バッククォートの直後に最初の行を配置し、最後の行をバッククォートで終了する必要があります。
`This string is on multiple lines within three single quotes on either side.`
解釈された文字列リテラルを作成する必要がある場合は、二重引用符と+
演算子を使用して作成できますが、独自の改行を挿入する必要があります。
"This string is on\n" + "multiple lines\n" + "within three single\n" + "quotes on either side."
逆引用符を使用すると、長いテキストの印刷と読み取りが簡単になりますが、解釈された文字列リテラルが必要な場合は、二重引用符を使用する必要があります。
生の文字列リテラル
文字列内に特別なフォーマットが必要ない場合はどうなりますか? たとえば、バックスラッシュを意図的に使用するコンピュータコードの文字列を比較または評価する必要がある場合があるため、Goでバックスラッシュをエスケープ文字として使用することは望ましくありません。
raw 文字列リテラルは、エスケープ文字を含む文字列内のすべてのフォーマットを無視するようにGoに指示します。
文字列の前後に引用符を使用して生の文字列を作成します。
fmt.Println(`Sammy says,\"The balloon\'s color is red.\"`)
OutputSammy says,\"The balloon\'s color is red.\"
特定の文字列をバッククォートで囲んで生の文字列を作成することにより、エスケープ文字として使用されるバックスラッシュやその他の文字を保持できます。
結論
このチュートリアルでは、文字列の操作を実行してテキストをフォーマットするいくつかの方法について説明しました。 エスケープ文字や生の文字列などの手法を使用することで、プログラムの文字列が画面上で正しくレンダリングされ、エンドユーザーがすべての出力テキストを簡単に読み取れるようにすることができます。