
- Go言語で文字列を自在に操る!基本操作から応用テクニックまで
- 1. 文字列の基本
- 2. 文字列の結合
- 3. 文字列の比較
- 4. 文字列の検索
- 5. 文字列の置換
- 6. 文字列の分割
- 7. 文字列のトリミング
- まとめ
Go言語で文字列を自在に操る!基本操作から応用テクニックまで
Go言語は、シンプルでありながら強力な文字列操作機能を提供しています。テキスト処理は、Web開発、データ処理、CLIツール開発など、様々なプログラミングの場面で不可欠です。
この記事では、Go言語における文字列の基本的な扱い方から、より高度な操作テクニックまでを、豊富なコード例を交えながら解説します。Go言語で文字列を自由自在に操り、あなたのプログラミングスキルをさらに向上させましょう!
Go言語の基本的な構文はこちらの記事で紹介してます。
1. 文字列の基本
Go言語における文字列は、string 型で表されます。文字列はイミュータブル(不変)であり、一度作成された文字列の内容を変更することはできません。
文字列の作成
文字列は、ダブルクォート (") またはバッククォート (`) で囲んで作成します。
package main import "fmt" func main() { str1 := "Hello, Go!" str2 := `This is a multi-line string.` fmt.Println(str1) fmt.Println(str2) }
ダブルクォートで囲まれた文字列では、エスケープシーケンス(\n, \t など)が解釈されますが、バッククォートで囲まれた文字列は、改行やタブなどの文字をそのまま含めることができます(raw string literal)。
文字列の長さ
文字列の長さを取得するには、組み込み関数 len() を使用します。
package main import "fmt" func main() { str := "こんにちは" length := len(str) fmt.Println(length) // 出力: 15 (UTF-8 エンコードされたバイト数) }
日本語などのマルチバイト文字を含む文字列の場合、len() 関数は文字数ではなく、UTF-8 エンコードされたバイト数を返します。文字数を取得したい場合は、unicode/utf8 パッケージの RuneCountInString() 関数を使用します。
package main import ( "fmt" "unicode/utf8" ) func main() { str := "こんにちは" runeCount := utf8.RuneCountInString(str) fmt.Println(runeCount) // 出力: 5 (文字数) }
文字列へのアクセス
文字列は、インデックスを使って個々のバイトにアクセスできます(0ベース)。
package main import "fmt" func main() { str := "Hello" fmt.Println(str[0]) // 出力: 72 ('H' の ASCII コード) fmt.Println(string(str[0])) // 出力: H }
文字列はバイトのシーケンスであるため、インデックスでアクセスすると byte 型の値(UTF-8 エンコードされたバイト値)が返ります。文字として扱いたい場合は、string() 型にキャストする必要があります。
2. 文字列の結合
複数の文字列を結合するには、+ 演算子を使用します。
package main import "fmt" func main() { str1 := "Hello" str2 := ", Go!" result := str1 + str2 fmt.Println(result) // 出力: Hello, Go! }
より効率的に多くの文字列を結合する場合は、strings パッケージの Join() 関数や strings.Builder を利用することが推奨されます。
package main import ( "fmt" "strings" ) func main() { parts := []string{"Hello", ",", " ", "Go", "!"} result1 := strings.Join(parts, "") fmt.Println(result1) // 出力: Hello, Go! var builder strings.Builder builder.WriteString("Hello") builder.WriteString(", ") builder.WriteString("Go!") result2 := builder.String() fmt.Println(result2) // 出力: Hello, Go! }
3. 文字列の比較
文字列の比較には、== 演算子を使用します。
package main import "fmt" func main() { str1 := "Go" str2 := "Go" str3 := "go" fmt.Println(str1 == str2) // 出力: true fmt.Println(str1 == str3) // 出力: false (大文字と小文字を区別) }
大文字・小文字を区別せずに比較したい場合は、strings パッケージの ToLower() または ToUpper() 関数を使用します。
package main import ( "fmt" "strings" ) func main() { str1 := "Go" str3 := "go" fmt.Println(strings.ToLower(str1) == strings.ToLower(str3)) // 出力: true }
4. 文字列の検索
strings パッケージには、文字列の検索に関連する便利な関数が多数用意されています。
strings.Contains(s, substr string) bool: 文字列sが部分文字列substrを含むかどうかを返します。strings.Index(s, substr string) int: 文字列s内で部分文字列substrが最初に出現するインデックスを返します。見つからない場合は -1 を返します。strings.LastIndex(s, substr string) int: 文字列s内で部分文字列substrが最後に出現するインデックスを返します。見つからない場合は -1 を返します。strings.HasPrefix(s, prefix string) bool: 文字列sが指定されたプレフィックスprefixで始まるかどうかを返します。strings.HasSuffix(s, suffix string) bool: 文字列sが指定されたサフィックスsuffixで終わるかどうかを返します。
package main import ( "fmt" "strings" ) func main() { str := "Hello, Go is fun!" fmt.Println(strings.Contains(str, "Go")) // 出力: true fmt.Println(strings.Index(str, "Go")) // 出力: 7 fmt.Println(strings.LastIndex(str, "o")) // 出力: 8 fmt.Println(strings.HasPrefix(str, "Hello")) // 出力: true fmt.Println(strings.HasSuffix(str, "!")) // 出力: true }
5. 文字列の置換
文字列の一部を別の文字列で置換するには、strings パッケージの Replace() 関数を使用します。
strings.Replace(s, old string, new string, n int) string: 文字列s内の最初のn個のoldをnewに置換した新しい文字列を返します。nに -1 を指定すると、すべてのoldが置換されます。
package main import ( "fmt" "strings" ) func main() { str := "Hello, Go is Go!" result1 := strings.Replace(str, "Go", "Golang", 1) fmt.Println(result1) // 出力: Hello, Golang is Go! result2 := strings.Replace(str, "Go", "Golang", -1) fmt.Println(result2) // 出力: Hello, Golang is Golang! }
6. 文字列の分割
文字列を指定された区切り文字で分割するには、strings パッケージの Split() 関数を使用します。
strings.Split(s, sep string) []string: 文字列sを区切り文字sepで分割した文字列のスライスを返します。
package main import ( "fmt" "strings" ) func main() { str := "apple,banana,cherry" parts := strings.Split(str, ",") fmt.Println(parts) // 出力: [apple banana cherry] }
7. 文字列のトリミング
文字列の先頭と末尾の空白文字(スペース、タブ、改行など)を削除するには、strings パッケージの TrimSpace() 関数を使用します。特定の文字をトリミングしたい場合は、Trim() 関数を使用します。
package main import ( "fmt" "strings" ) func main() { strWithSpace := " Hello, Go! \n" trimmedStr := strings.TrimSpace(strWithSpace) fmt.Println(trimmedStr) // 出力: Hello, Go! strWithChars := "***Hello, Go!***" trimmedChars := strings.Trim(strWithChars, "*") fmt.Println(trimmedChars) // 出力: Hello, Go! }
まとめ
この記事では、Go言語における基本的な文字列操作について解説しました。文字列の作成、長さの取得、結合、比較、検索、置換、分割、トリミングなど、Go言語でテキスト処理を行う上で重要な操作を理解できたかと思います。
strings パッケージには、他にも多くの便利な関数が用意されています。公式ドキュメントなどを参照して、さらに高度な文字列操作をマスターし、Go言語での開発をより快適に進めていきましょう。