Go言語の文字列の基本!文字列リテラルとエスケープシーケンスを初心者向けに解説
先生と生徒の会話形式で理解しよう
生徒
「Go言語で文字列ってどうやって書くんですか?」
先生
「Go言語では文字列を表すときに文字列リテラルを使います。リテラルとは、そのままソースコードに書いた文字列のことです。」
生徒
「文字列リテラルって具体的にはどんなものなんですか?」
先生
「例えば、"Hello"や`こんにちは`のようにダブルクオーテーションやバッククオートで囲んで書きます。違いについてはこれから詳しく説明しますよ。」
1. Go言語の文字列リテラルとは?
Go言語の文字列リテラルには、主に2種類あります。
- ダブルクオーテーション("")で囲む方法:改行を含めず、エスケープシーケンスを利用できる。
- バッククオート(``)で囲む方法:複数行をそのまま表現でき、エスケープシーケンスを解釈しない。
簡単に言うと、"..."は「プログラム的に特別な書き方ができる文字列」、`...`は「そのまま書いた通りの文字列」と覚えると分かりやすいです。
package main
import "fmt"
func main() {
str1 := "Hello\nWorld"
str2 := `Hello
World`
fmt.Println(str1)
fmt.Println(str2)
}
Hello
World
Hello
World
この例では、ダブルクオーテーションの方は\nが改行として解釈されますが、バッククオートの方はそのまま改行が保持されています。
2. エスケープシーケンスとは?
エスケープシーケンスとは、文字列の中で特殊な意味を持つ書き方のことです。普段そのまま書けない文字(改行やタブ、クオーテーション記号など)を表現するために使います。
Go言語でよく使うエスケープシーケンスを表にまとめました。
| エスケープシーケンス | 意味 | 例 |
|---|---|---|
| \n | 改行 | "Hello\nWorld" |
| \t | タブ(空白を広めに空ける) | "A\tB" |
| \" | ダブルクオーテーションそのもの | "She said \"Hi\"" |
| \\ | バックスラッシュそのもの | "C:\\path" |
package main
import "fmt"
func main() {
fmt.Println("Hello\nWorld") // 改行
fmt.Println("A\tB") // タブ
fmt.Println("She said \"Hi\"") // ダブルクオーテーション
fmt.Println("C:\\path") // バックスラッシュ
}
Hello
World
A B
She said "Hi"
C:\path
このように、普通に書けない文字もエスケープシーケンスを使うことで表現できます。
3. ダブルクオーテーションとバッククオートの使い分け
初心者の方は「どっちを使えばいいの?」と迷うかもしれません。目安は次の通りです。
- プログラムで改行やタブを入れたいとき → ダブルクオーテーションを使う
- 複数行のテキストをそのまま書きたいとき → バッククオートを使う
例えば、SQL文や長いHTMLのテンプレートなどをそのまま文字列として書きたい場合には、バッククオートを使うと便利です。
sql := `
SELECT id, name
FROM users
WHERE age > 20;
`
fmt.Println(sql)
SELECT id, name
FROM users
WHERE age > 20;
このように、改行やインデントを含んだ文字列をそのまま書けるのはバッククオートならではの特徴です。
4. 文字列リテラルとエスケープシーケンスの注意点
Go言語で文字列を扱うときに、次の点に注意しておきましょう。
- バッククオートではエスケープシーケンスは無効:
\nを書いてもただの文字として扱われます。 - ダブルクオーテーションでは必ずエスケープが必要:特殊な記号をそのまま書くとエラーになるので注意しましょう。
- 文字列は変更できない:Goの文字列はイミュータブル(変更不可)です。途中の文字を直接書き換えることはできません。
もし文字列を加工したいときは、新しい文字列を作るというイメージを持つと理解しやすいです。