【Go言語】【GoLang】文字列操作完全攻略!基本・結合・分割・検索・置換

Go言語で文字列を自在に操る!基本操作から応用テクニックまで

Go言語は、シンプルでありながら強力な文字列操作機能を提供しています。テキスト処理は、Web開発、データ処理、CLIツール開発など、様々なプログラミングの場面で不可欠です。

この記事では、Go言語における文字列の基本的な扱い方から、より高度な操作テクニックまでを、豊富なコード例を交えながら解説します。Go言語で文字列を自由自在に操り、あなたのプログラミングスキルをさらに向上させましょう!

Go言語の基本的な構文はこちらの記事で紹介してます。

taglibrary.hatenablog.com

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 個の oldnew に置換した新しい文字列を返します。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言語での開発をより快適に進めていきましょう。