【Go言語】Contains関数の使い方8選 – Japanシーモア

【Go言語】Contains関数の使い方8選

Go言語Contains関数を徹底解説するイメージGo言語
この記事は約15分で読めます。

 

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

このサービスは複数のSSPによる協力の下、運営されています。

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

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

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

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

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

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

はじめに

この記事を読むことで、Go言語のContains関数の使い方を基礎から応用まで学ぶことができます。

Go言語はGoogleによって開発されたプログラミング言語で、シンプルで効率的なコードの記述が可能です。

この記事では、特にプログラミング初心者にも理解しやすいように、Go言語の基本概念とContains関数の使い方を丁寧に解説していきます。

●Go言語とは

Go言語は、効率的で読みやすいコードが特徴のプログラミング言語です。

コンパイルが速く、並列処理やネットワークプログラミングに優れているため、大規模なシステムやサーバーサイドの開発に適しています。

また、独特のゴルーチンという概念を採用しており、複数のタスクを同時に処理することが容易になっています。

○Go言語の基本

Go言語は、静的型付け言語でありながらも、動的型付け言語のような柔軟性を持ち合わせています。

基本的な文法はC言語に似ているため、C言語の経験がある人には親しみやすいかもしれません。

しかし、Go言語独自の特徴も多く、例えばガベージコレクション、パッケージシステム、ストリクトなエラーハンドリングなどがあります。

○プログラミング初心者にも優しいGo言語

Go言語はその設計思想から、プログラミング初心者にも学びやすい言語と言えます。

シンプルな文法と明確な構造が特徴で、読みやすく書きやすいコードを実現しています。

また、標準ライブラリが充実しており、多くの機能を簡単に利用できるのも魅力の一つです。

これらの特性により、Go言語は初心者がプログラミングの基本を学ぶのに適した言語と言えるでしょう。

●Contains関数の基本

Go言語において、Contains関数は文字列操作の基本的な部分を担っています。

この関数は、ある文字列が別の文字列内に存在するかどうかをチェックするために使用されます。

具体的には、Contains関数は2つの引数を取り、第一引数には検索対象の文字列、第二引数には検索したい部分文字列を指定します。

戻り値として、部分文字列が含まれている場合はtrue、そうでない場合はfalseを返します。

この関数の使用は非常にシンプルですが、多くのプログラミングシナリオで非常に役立ちます。

例えば、ユーザー入力の検証、データのフィルタリング、特定のキーワードが含まれているかどうかの確認など、さまざまな場面で活用できます。

○Contains関数とは

Go言語の標準ライブラリの一部である”strings”パッケージに含まれるContains関数は、下記のように定義されています。

func Contains(s, substr string) bool

ここで、sは検索される文字列、substrs内で検索される部分文字列です。

この関数は、substrs内に存在するかどうかをチェックし、存在すればtrueを、存在しなければfalseを返します。

○Contains関数の重要性

Contains関数の重要性はその汎用性にあります。

文字列の検索はプログラミングにおいて頻繁に行われる操作であり、Contains関数はこの操作を簡単かつ効率的に行う方法を提供します。

特に、大量のテキストデータを処理する際や、特定のパターンやキーワードを含むデータを識別する必要がある場合に、この関数は非常に有用です。

また、Contains関数はGo言語のコードを書く上での読みやすさとメンテナンスのしやすさをもたらします。

簡潔な構文と明確な動作原理により、コードの可読性が高まり、バグの発生を減らすことにも繋がります。

●Contains関数の使い方

Go言語におけるContains関数の使い方を理解するには、具体的なサンプルコードを通じて学ぶのが最も効果的です。

ここでは、基本的な文字列検索から始めて、より高度な使用方法に進んでいきます。

○サンプルコード1:基本的な文字列検索

最も基本的な形のContains関数の使用例を紹介します。

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(strings.Contains("hello world", "world")) // trueが出力される
}

この例では、”hello world”という文字列内に”world”という部分文字列が含まれているかをチェックしています。

結果として、”world”は”hello world”に含まれているため、trueが出力されます。

○サンプルコード2:複数の条件での検索

Contains関数を使用して複数の条件をチェックすることも可能です。

下記のサンプルコードでは、2つの異なる文字列を検索しています。

package main

import (
    "fmt"
    "strings"
)

func main() {
    text := "この文章にはいくつかのキーワードが含まれています。"

    fmt.Println(strings.Contains(text, "文章")) // trueが出力される
    fmt.Println(strings.Contains(text, "キーワード")) // trueが出力される
    fmt.Println(strings.Contains(text, "存在しない単語")) // falseが出力される
}

このコードでは、まず”text”という文字列が”文章”と”キーワード”を含んでいるかをチェックしています。

どちらも含まれているため、それぞれtrueが出力されます。

次に、存在しない単語に対してチェックを行い、falseが出力されることを確認しています。

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

Go言語のContains関数はデフォルトで大文字と小文字を区別します。

しかし、場合によってはこの区別をせずに検索したいこともあります。

このような場合は、文字列を一旦同じケース(例えばすべて小文字)に変換してから検索を行います。

package main

import (
    "fmt"
    "strings"
)

func main() {
    text := "Hello World"

    fmt.Println(strings.Contains(strings.ToLower(text), "world")) // trueが出力される
}

この例では、”Hello World”という文字列をstrings.ToLower関数で全て小文字に変換した後、”world”という文字列を検索しています。

これにより、大文字小文字を区別せずに検索を行うことができます。

○サンプルコード4:文字列の部分一致検索

Go言語のContains関数は、文字列の部分一致検索にも使用できます。

部分一致検索は、特定の文字列が他の文字列内のどこかに存在するかどうかを確認する際に便利です。

下記のサンプルコードは、文章中に特定の単語が含まれているかを確認する方法を表しています。

package main

import (
    "fmt"
    "strings"
)

func main() {
    text := "Go言語は、型安全性と並行処理をサポートするプログラミング言語です。"
    word := "並行処理"

    if strings.Contains(text, word) {
        fmt.Println(word + "が含まれています。")
    } else {
        fmt.Println(word + "は含まれていません。")
    }
}

このコードは、変数text内に変数wordが含まれているかどうかをチェックし、結果に基づいてメッセージを出力します。

この例では”並行処理”という単語が文章内に存在するため、”並行処理が含まれています。”と出力されます。

○サンプルコード5:スライスや配列での検索

Contains関数は、スライスや配列の各要素を検索する際にも役立ちます。

下記のコード例では、スライス内に特定の文字列が含まれているかどうかを確認しています。

package main

import (
    "fmt"
    "strings"
)

func main() {
    fruits := []string{"apple", "banana", "cherry"}
    search := "banana"

    for _, fruit := range fruits {
        if strings.Contains(fruit, search) {
            fmt.Println(search + "が見つかりました。")
            break
        }
    }
}

このサンプルでは、fruitsというスライス内をループし、各要素がsearch変数の値を含んでいるかをチェックしています。

この例では”banana”がスライス内に存在するため、”bananaが見つかりました。”という結果が出力されます。

●Contains関数の応用例

Go言語のContains関数は、その基本的な文字列検索機能を超えて、様々な実用的なシナリオで応用することができます。

ここでは、ログファイルからの特定キーワードの抽出、ユーザー入力の検証、そしてデータフィルタリングといった応用例を具体的なサンプルコードと共に紹介します。

○サンプルコード6:ログファイルからの特定キーワード抽出

ログファイルから特定のキーワードやフレーズを抽出する場合、Contains関数は非常に役立ちます。

下記のサンプルコードでは、ログの各行を調べて特定のキーワードを含む行を見つけ出しています。

package main

import (
    "bufio"
    "fmt"
    "strings"
    "os"
)

func main() {
    file, err := os.Open("log.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        line := scanner.Text()
        if strings.Contains(line, "エラー") {
            fmt.Println(line)
        }
    }

    if err := scanner.Err(); err != nil {
        panic(err)
    }
}

このコードは”log.txt”というログファイルを開き、各行に”エラー”という単語が含まれているかをチェックしています。

含まれている場合、その行を出力します。

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

ユーザーからの入力に特定の文字列が含まれているかどうかを確認することも、Contains関数の一般的な使用例です。

例えば、入力されたメールアドレスに特定のドメインが含まれているかを確認することができます。

package main

import (
    "fmt"
    "strings"
)

func main() {
    email := "user@example.com"
    if strings.Contains(email, "@example.com") {
        fmt.Println("有効なメールアドレスです。")
    } else {
        fmt.Println("無効なメールアドレスです。")
    }
}

この例では、入力されたメールアドレスが”@example.com”を含んでいるかを確認しています。

含まれていれば”有効なメールアドレスです。”と出力し、そうでなければ”無効なメールアドレスです。”と出力します。

○サンプルコード8:データフィルタリング

データセットから特定の条件に合致する要素をフィルタリングする際にも、Contains関数は有用です。

下記のコード例では、商品リストから特定のキーワードを含む商品だけを選び出しています。

package main

import (
    "fmt"
    "strings"
)

func main() {
    products := []string{"ゲーム機", "スマートフォン", "ノートパソコン", "タブレット"}
    keyword := "パソコン"

    for _, product := range products {
        if strings.Contains(product, keyword) {
            fmt.Println(product)
        }
    }
}

このサンプルでは、productsというスライス内の各商品名にkeywordで指定された”パソコン”が含まれているかをチェックし、含まれている商品名を出力しています。

●注意点と対処法

Go言語におけるContains関数を使用する際には、いくつかの注意点があります。

これらの注意点を理解し、適切に対処することで、プログラムの効率と信頼性を高めることができます。

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

Contains関数はバイト単位で文字列を処理するため、マルチバイト文字のエンコーディングに注意する必要があります。

特に、UTF-8以外のエンコーディングで記述された文字列を扱う場合、予期しない結果を招く可能性があります。

package main

import (
    "fmt"
    "strings"
)

func main() {
    // UTF-8でエンコードされた文字列
    s := "こんにちは、世界!"
    fmt.Println(strings.Contains(s, "世界")) // trueが出力される

    // Shift-JISなど他のエンコーディングを使用している場合
    // 文字エンコーディングを適切に処理する必要がある
}

この例では、UTF-8エンコーディングで記述された日本語の文字列に対してContains関数を使用しています。

異なるエンコーディングを扱う場合は、Go言語の文字エンコーディング変換機能を適切に使用することが重要です。

○パフォーマンスに関する考慮事項

Contains関数は比較的単純な処理ですが、大量のデータや長い文字列を扱う際にはパフォーマンスに影響を与える可能性があります。

特に、大規模なテキスト処理やループ内での頻繁な使用は、パフォーマンスの低下を招くことがあります。

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    file, err := os.Open("largeTextFile.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        // 大量のデータを扱う場合、Contains関数の呼び出しによるパフォーマンスの影響を考慮する
        if strings.Contains(scanner.Text(), "特定のキーワード") {
            // 処理
        }
    }
}

この例では、大きなテキストファイルを行ごとに読み込み、各行に特定のキーワードが含まれているかをチェックしています。

このような場合、パフォーマンスを考慮し、必要に応じて効率的な検索アルゴリズムやデータ構造を検討することが重要です。

●カスタマイズ方法

Go言語のContains関数をさらに効率的に使用するためには、カスタム検索関数の作成や効率的な検索アルゴリズムの導入が有効です。

これにより、特定のニーズに合わせた検索処理を実現することができます。

○カスタム検索関数の作成

特定の用途に特化した検索機能が必要な場合、独自のカスタム検索関数を作成することが推奨されます。

下記のサンプルコードは、文字列内で特定の単語が出現する回数をカウントするカスタム検索関数の例です。

package main

import (
    "fmt"
    "strings"
)

// CountOccurrences は、対象の文字列内に特定の単語が何回出現するかをカウントする関数
func CountOccurrences(text string, word string) int {
    return strings.Count(text, word)
}

func main() {
    text := "この文章には繰り返し同じ単語が何度も登場する。同じ単語、同じ単語、同じ単語。"
    word := "同じ単語"

    count := CountOccurrences(text, word)
    fmt.Printf("'%s' は %d 回出現します。\n", word, count)
}

この関数は、指定されたwordtext内に何回出現するかをカウントし、その数を返します。

このように、Go言語の既存関数を利用しつつ、特定のニーズに合わせた機能を実装することが可能です。

○効率的な検索アルゴリズムの導入

大量のデータや複雑な文字列処理を行う場合、効率的な検索アルゴリズムを導入することが重要です。

たとえば、KMPアルゴリズムやボイヤー・ムーアアルゴリズムなど、高度な文字列検索アルゴリズムを採用することで、検索処理のパフォーマンスを大幅に向上させることができます。

これらのアルゴリズムは、標準のContains関数よりも複雑な処理を伴いますが、大規模なデータセットや高頻度での検索を行うアプリケーションにおいては、その効果は顕著になります。

まとめ

この記事では、Go言語のContains関数の基本的な使い方から応用例、注意点、さらにはカスタム検索関数の作成や効率的な検索アルゴリズムの導入に至るまでを詳細に解説しました。

初心者から上級者まで、Go言語のContains関数を効果的に使いこなすための知識を提供することを目的としています。

この情報を活用し、Go言語プログラミングの可能性を広げていただければ幸いです。