カテゴリ: Go言語 更新日: 2025/11/01

Go言語の文字列操作設計パターン集!メンテナンス性の高いコード例

Go言語の文字列操作設計パターン集!メンテナンス性の高いコード例
Go言語の文字列操作設計パターン集!メンテナンス性の高いコード例

先生と生徒の会話形式で理解しよう

生徒

「Goで文字列操作をするとき、後から修正や拡張が簡単にできる書き方ってありますか?」

先生

「はい、設計パターンを意識してコードを書くことで、メンテナンス性の高い文字列操作が可能になります。特に関数の分割や抽象化、共通処理の切り出しがポイントです。」

生徒

「具体的にはどのようなパターンがありますか?」

先生

「それでは、基本的なパターンとサンプルコードを順に見ていきましょう!」

1. 共通関数に切り出すパターン

1. 共通関数に切り出すパターン
1. 共通関数に切り出すパターン

文字列操作を複数の場所で使う場合、共通関数として切り出すとコードの重複を減らせます。例えば、文字列の前後の空白を削除する処理を共通関数にします。


package main

import "strings"

func TrimSpaces(s string) string {
    return strings.TrimSpace(s)
}

こうすることで、後から処理を変更する際も、この関数だけ修正すれば全体に反映されます。

2. 小さな処理に分けるパターン

2. 小さな処理に分けるパターン
2. 小さな処理に分けるパターン

一つの関数に多くの処理を書きすぎると、修正やテストが難しくなります。小さな処理ごとに関数を分けることで、テストや再利用が容易になります。


func ToUpperCase(s string) string {
    return strings.ToUpper(s)
}

func RemoveHyphens(s string) string {
    return strings.ReplaceAll(s, "-", "")
}

このように関数を分けることで、必要な処理だけ呼び出すことができ、柔軟に組み合わせられます。

3. インターフェースで抽象化するパターン

3. インターフェースで抽象化するパターン
3. インターフェースで抽象化するパターン

文字列操作の種類が増えても、共通のインターフェースを使うことで、処理の切り替えが簡単になります。


type StringProcessor interface {
    Process(s string) string
}

type UpperProcessor struct{}

func (u UpperProcessor) Process(s string) string {
    return strings.ToUpper(s)
}

type TrimProcessor struct{}

func (t TrimProcessor) Process(s string) string {
    return strings.TrimSpace(s)
}

このようにすると、StringProcessorを使って統一的に文字列操作を呼び出せます。

4. パイプラインで処理を連結するパターン

4. パイプラインで処理を連結するパターン
4. パイプラインで処理を連結するパターン

複数の文字列操作を順番に実行する場合は、パイプライン形式で処理をつなぐと可読性が上がります。


func ProcessString(s string, processors ...StringProcessor) string {
    for _, p := range processors {
        s = p.Process(s)
    }
    return s
}

func main() {
    text := "  go-lang  "
    result := ProcessString(text, TrimProcessor{}, UpperProcessor{})
}

この方法だと、処理の順番を簡単に変えられ、追加の操作も柔軟に対応できます。

5. テストしやすい設計にするパターン

5. テストしやすい設計にするパターン
5. テストしやすい設計にするパターン

メンテナンス性を上げるためには、テストしやすい設計にすることも重要です。小さな関数に分割して、個別にテストできる構造にします。


func TestTrimSpaces(t *testing.T) {
    input := "  hello  "
    expected := "hello"
    result := TrimSpaces(input)
    if result != expected {
        t.Errorf("期待値: %s, 実際: %s", expected, result)
    }
}

関数が小さいほどテストが簡単になり、バグを早く発見できます。

6. データ駆動で汎用化するパターン

6. データ駆動で汎用化するパターン
6. データ駆動で汎用化するパターン

文字列操作のルールをデータとして管理すると、コードの変更を最小限に抑えられます。例えば、置換ルールをスライスで管理します。


var replacements = []struct{
    old string
    new string
}{
    {"-", ""},
    {"_", " "},
}

func ReplaceMultiple(s string) string {
    for _, r := range replacements {
        s = strings.ReplaceAll(s, r.old, r.new)
    }
    return s
}

この方法だと、新しい置換ルールを追加するだけでコードを修正せずに対応可能です。

7. メンテナンス性を意識した文字列操作設計のポイント

7. メンテナンス性を意識した文字列操作設計のポイント
7. メンテナンス性を意識した文字列操作設計のポイント
  • 共通処理は関数に切り出して再利用する。
  • 関数は小さく分割してテストしやすくする。
  • インターフェースや抽象化で柔軟性を持たせる。
  • パイプラインやデータ駆動で処理を連結・汎用化する。
  • テスト可能な設計にすることで、後からの修正も安全。

これらのパターンを意識するだけで、Go言語での文字列操作がメンテナンス性の高いコードになります。

カテゴリの一覧へ
新着記事
Go言語の関数でエラーハンドリングする基本的な方法
Go言語のスライス・マップ・配列をまとめて比較してみよう!初心者でもわかる使い分けの基本
Go言語の条件分岐の見やすい書き方を徹底解説!初心者でもわかるif文の使い方
Go言語とは何か?初心者向けに特徴・できること・インストール手順までやさしく解説
人気記事
No.1
Java&Spring記事人気No1
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.2
Java&Spring記事人気No2
Go言語で条件式を1行で書くコツ!三項演算子の代替と短縮記法
No.3
Java&Spring記事人気No3
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.4
Java&Spring記事人気No4
Kotlinのデータクラス(data class)とは?便利な特徴と使い方を初心者向けにやさしく解説!