Go言語のstrings.Contains活用法を初心者向けに7つの簡単例で解説

Go言語のstrings.Contains関数の使い方を解説する記事のサムネイル画像Go言語
この記事は約14分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Go言語は、シンプルで効率的なプログラミング言語として人気があります。

その中でも、stringsパッケージに含まれるstrings.Contains関数は、日常的な文字列操作において非常に重要な役割を果たします。

この記事では、Go言語の初心者がstrings.Containsの基本から応用までを理解し、実際のプログラミングに活用できるように詳細に解説していきます。

例を挙げながら、分かりやすく説明することで、読者の皆様がGo言語の文字列操作の基本を習得し、さらに応用へと進むことができるようになります。

この記事を通じて、strings.Contains関数の使い方をマスターしましょう。

●Go言語のstrings.Containsとは

Go言語におけるstrings.Contains関数は、ある文字列が別の文字列に含まれているかどうかを判定するために使用されます。

この関数は、stringsパッケージの一部として提供され、2つの引数を取ります。第一引数は検索対象の文字列、第二引数は検索したい部分文字列です。

戻り値はブール型(trueまたはfalse)で、部分文字列が含まれている場合にはtrue、含まれていない場合にはfalseを返します。

この関数の使用例としては、ユーザー入力の検証、ログファイル内の特定のキーワードの検索、あるいはデータのフィルタリングなどが挙げられます。

非常に汎用性が高く、様々な場面で利用することができるため、Go言語を学ぶ際には欠かせない関数の一つです。

○strings.Containsの基本

strings.Contains関数の基本的な使い方は非常にシンプルです。

下記のような形式で使用します。

contains := strings.Contains("検索対象の文字列", "部分文字列")

このコードでは、"検索対象の文字列"の中に"部分文字列"が含まれているかどうかをチェックし、結果を変数containsに格納しています。

もし"部分文字列"が含まれていればcontainstrueに、そうでなければfalseになります。

この単純な構造により、開発者は簡単に文字列の検索やチェックを行うことができます。

例えば、ユーザーがフォームに入力したメールアドレスに"@"が含まれているかどうかを確認する場合、下記のようなコードを書くことができます。

email := "user@example.com"
isValidEmail := strings.Contains(email, "@")

このコードでは、email変数に格納された文字列に"@"が含まれているかをチェックしています。もし"@"が含まれていれば、isValidEmailtrueになります。

●strings.Containsの使い方

Go言語におけるstrings.Contains関数の使い方は、そのシンプルさから多様な場面で利用できます。

基本的な使い方は、ある文字列が別の文字列に含まれているかどうかを判定することですが、実際の使用例はもっと幅広いものとなります。

ここでは、具体的な使い方をいくつかのサンプルコードを通じて紹介します。

○サンプルコード1:文字列に特定の文字列が含まれているかを確認する

一番基本的な使用例は、ある文字列が特定の文字列を含むかどうかを確認することです。

例えば、ある文字列が”http://”または”https://”を含むかどうかをチェックし、ウェブサイトのURLであるかを確認する場合、下記のようなコードを書くことができます。

url := "https://www.example.com"
isHttp := strings.Contains(url, "http://")
isHttps := strings.Contains(url, "https://")

if isHttp || isHttps {
    // URLがhttpまたはhttpsを含む場合の処理
}

このコードでは、url変数に格納された文字列が”http://”または”https://”を含むかどうかをチェックしています。

含まれていれば、その後の処理を行うという流れです。

○サンプルコード2:大文字小文字を区別しない文字列検索

strings.Containsは大文字と小文字を区別しますが、時にはこれを無視して検索を行いたい場合があります。

そのような場合は、strings.ToLowerまたはstrings.ToUpperを使用して両方の文字列を同じケースに変換し、その上でstrings.Containsを使います。

下記の例では、大文字小文字を区別せずに特定の文字列を検索しています。

text := "Go言語は素晴らしいです!"
search := "GO"

textLower := strings.ToLower(text)
searchLower := strings.ToLower(search)

contains := strings.Contains(textLower, searchLower)

if contains {
    // textがsearchを大文字小文字を区別せずに含む場合の処理
}

ここでは、textsearchの両方を小文字に変換した後、strings.Containsを使用しています。

○サンプルコード3:複数の文字列を検索する

strings.Containsを使用して複数の異なる文字列を一度に検索することも可能です。

下記の例では、複数のキーワードが文字列に含まれているかどうかを確認しています。

text := "この文章にはいくつかのキーワードが含まれています。"
keywords := []string{"キーワード", "文章", "含まれて"}

for _, keyword := range keywords {
    if strings.Contains(text, keyword) {
        // textがkeywordを含む場合の処理
    }
}

このコードでは、keywordsスライスに格納された各キーワードがtext変数の文字列に含まれているかどうかを順番にチェックしています。

どのキーワードもstrings.Containsを使用して検索されています。

○サンプルコード4:文字列が含まれる位置を見つける

strings.Contains関数は、特定の文字列が含まれているかどうかを判断するのに便利ですが、文字列がどこに含まれているかを知るためには別の方法が必要です。

Go言語にはstrings.Index関数があり、これを使って文字列内の特定の文字列の位置を見つけることができます。

下記のコードでは、strings.Indexを使用して文字列内の特定の文字列の開始位置を探しています。

text := "こんにちは、Go言語の世界へようこそ。"
search := "Go言語"

position := strings.Index(text, search)

if position >= 0 {
    // 文字列が見つかった場合の処理
    // positionはsearchがtext内に見つかった開始位置
}

このコードでは、text変数の中でsearch変数が指す文字列が最初に登場する位置をpositionに格納しています。

もし文字列が見つからなければ、strings.Indexは-1を返します。

○サンプルコード5:strings.Containsを使ったデータフィルタリング

strings.Containsは、データをフィルタリングする際にも役立ちます。

例えば、特定のキーワードを含むテキストのリストを作成する場合、下記のようなコードを使用できます。

texts := []string{
    "Go言語はシンプルで強力です。",
    "このテキストにはキーワードが含まれていません。",
    "Go言語を学ぶのは楽しいです。",
}

keyword := "Go言語"
filteredTexts := []string{}

for _, text := range texts {
    if strings.Contains(text, keyword) {
        filteredTexts = append(filteredTexts, text)
    }
}

// filteredTextsにはkeywordを含むテキストのみが格納される

この例では、textsスライス内の各テキストがkeywordを含むかどうかをチェックし、含むテキストだけをfilteredTextsスライスに追加しています。

この方法を使えば、特定の条件に基づいてデータを絞り込むことが可能です。

●strings.Containsの応用例

strings.Contains関数は、その基本的な使い方を超えて、様々な応用例があります。

プログラミングにおいて柔軟な思考を持つことは重要であり、strings.Containsを使ってさまざまな問題を解決する方法を考えることができます。

ここでは、いくつかの応用例を見ていきましょう。

○サンプルコード6:ユーザー入力の検証

ユーザーからの入力を検証する際にもstrings.Containsは非常に役立ちます。

例えば、ユーザーが入力した文字列に不適切な単語が含まれていないかをチェックする場合、下記のようなコードを書くことができます。

input := "これは適切なコメントです。"
bannedWords := []string{"不適切", "禁止"}

for _, word := range bannedWords {
    if strings.Contains(input, word) {
        // 不適切な単語が含まれている場合の処理
    }
}

このコードでは、ユーザー入力を変数inputに格納し、不適切な単語が含まれているかどうかをbannedWordsスライスを使ってチェックしています。

この方法は、フォーラムやコメントセクションなどでユーザーが適切な言葉遣いをしているかを確認するのに役立ちます。

○サンプルコード7:ファイル内の文字列検索

ファイル内の特定の文字列を探す場合にもstrings.Containsを使用できます。

たとえば、ログファイルから特定のエラーメッセージを探す場合、下記のようなコードが使用されます。

// ファイルを読み込む処理
fileContents := "2024年2月13日: エラーが発生しました。"
searchTerm := "エラー"

if strings.Contains(fileContents, searchTerm) {
    // 指定された文字列が含まれている場合の処理
}

この例では、fileContents変数にファイルから読み込んだ内容を格納し、searchTermを使用して特定の文字列が含まれているかどうかをチェックしています。

この方法は、ログ分析やデータ処理の自動化に有用です。

●注意点と対処法

strings.Contains関数を使用する際には、いくつかの重要な注意点があります。

これらを理解し、適切に対処することで、効率的かつ正確にプログラミングを行うことができます。

ここでは、strings.Containsの使用における主要な注意点とその対処法について詳しく見ていきましょう。

○文字エンコーディングの注意

Go言語は、デフォルトでUTF-8エンコーディングを使用します。

このため、strings.Containsを使用する際には、対象の文字列がUTF-8でエンコードされていることを確認する必要があります。

異なるエンコーディングの文字列を扱う場合は、適切に変換する処理を行う必要があります。

例えば、別のエンコーディングで書かれたテキストファイルを読み込む場合、下記のように変換を行うことが考えられます。

// 外部ライブラリを使用してエンコーディングの変換を行う
// 例: Shift-JISからUTF-8への変換
convertedText := convertEncodingToUTF8(originalText)

このように、strings.Containsを使用する前に、適切な文字エンコーディングへの変換を行うことが重要です。

○大文字小文字の扱い

strings.Contains関数は、大文字と小文字を区別して比較を行います。

場合によっては、大文字小文字を区別せずに検索を行いたいことがあります。

このような場合は、両方の文字列を同じケース(大文字または小文字)に変換した後に比較を行います。

例えば、下記のように大文字小文字を区別しない検索を行うことができます。

text := strings.ToLower("Go言語は素晴らしいです!")
search := strings.ToLower("go言語")

if strings.Contains(text, search) {
    // 大文字小文字を区別せずに検索が行われる
}

このコードでは、textsearchの両方を小文字に変換してからstrings.Containsで検索を行っています。

○性能面での考慮事項

strings.Contains関数は非常に便利ですが、大きなテキストや多数の文字列を扱う場合には、性能面での考慮が必要です。

特に、ループ内でstrings.Containsを多用すると、プログラムのパフォーマンスに影響を与える可能性があります。

性能の問題を避けるためには、下記のような対策を考えることができます。

  • 不必要なループや繰り返しの削減
  • 文字列操作の最適化
  • 必要な場合は並列処理やバッチ処理の検討

例えば、下記のようにループ内でのstrings.Containsの使用を避けることが考えられます。

// ループの外で必要な処理を行い、ループ内では最小限の操作に留める
preparedText := prepareTextForSearch(originalText)
for _, item := range items {
    if strings.Contains(preparedText, item) {
        // 必要な処理
    }
}

このように、strings.Containsの使用にはいくつか注意点がありますが、これらを適切に理解し対処することで、効率的かつ正確なプログラミングを実現できます。

●カスタマイズ方法

strings.Contains関数は非常に汎用的でありながら、特定の用途に合わせてカスタマイズすることも可能です。

カスタマイズによって、特定の要件を満たすための独自の文字列検索機能を作成することができます。

ここでは、strings.Containsを使ったカスタマイズの方法として、独自の文字列検索関数の作成と高度な文字列処理の応用例を紹介します。

○独自の文字列検索関数の作成

strings.Contains関数をベースにして、より複雑な検索条件を満たす独自の関数を作成することができます。

例えば、複数のキーワードがすべて含まれているかをチェックする関数を作成することが考えられます。

func containsAll(text string, keywords []string) bool {
    for _, keyword := range keywords {
        if !strings.Contains(text, keyword) {
            return false
        }
    }
    return true
}

text := "Go言語はシンプルで強力な言語です。"
keywords := []string{"Go言語", "シンプル", "強力"}

if containsAll(text, keywords) {
    // すべてのキーワードが含まれている場合の処理
}

この関数containsAllは、指定されたテキストにすべてのキーワードが含まれているかどうかをチェックします。

すべてのキーワードが含まれている場合にのみtrueを返します。

○strings.Containsを組み込んだ高度な文字列処理

strings.Containsを使用した高度な文字列処理の応用例として、特定のパターンに基づいてテキストを分析する処理が考えられます。

例えば、あるテキスト内に特定のセクションが存在するかをチェックし、そのセクションの内容を抽出する処理を実装することができます。

func extractSection(text, startKeyword, endKeyword string) string {
    startIndex := strings.Index(text, startKeyword)
    if startIndex == -1 {
        return ""
    }

    endIndex := strings.Index(text[startIndex:], endKeyword)
    if endIndex == -1 {
        return ""
    }

    return text[startIndex+len(startKeyword) : startIndex+endIndex]
}

text := "セクション1: この部分が重要です。セクション2: これは別の内容です。"
section := extractSection(text, "セクション1:", "セクション2:")

if section != "" {
    // 特定のセクションが見つかった場合の処理
}

この関数extractSectionは、startKeywordendKeywordで囲まれたテキストのセクションを抽出します。

特定のセクションを正確に特定し、その内容を取り出すことができます。

まとめ

この記事では、Go言語のstrings.Contains関数の基本的な使い方から応用例、注意点、そしてカスタマイズ方法までを幅広く解説しました。

strings.Containsは、そのシンプルさと強力な機能により、文字列検索やデータ処理において非常に役立つ関数です。

正確な文字列操作を行うための基本的な知識から、より複雑なシナリオでの応用まで、多様なプログラミングニーズに対応できることが明らかになったでしょう。

Go言語を学ぶ上での強力なツールとして、ぜひこの関数の活用を検討してみてください。