Go言語の文字列検索を徹底解説!Contains・Indexの使い方と活用法
生徒
「Go言語で文章の中から特定の言葉を探したいんですけど、どうすればいいですか?」
先生
「Go言語にはstringsパッケージが用意されていて、その中に文字列を検索するための便利な関数があります。代表的なのがContainsとIndexです。」
生徒
「その2つはどう違うんですか?」
先生
「とても良い質問ですね。Containsは文字列が含まれているかどうかを真偽値(trueかfalse)で返し、Indexはその文字列が見つかった場所の位置を数字で返してくれます。それでは順番に見ていきましょう。」
1. Go言語で文字列検索を行う方法
Go言語の文字列検索では、標準ライブラリであるstringsパッケージを使います。このパッケージは文字列の操作に特化していて、検索・置換・分割などさまざまな処理が可能です。特に初心者の方が最初に使うことになるのが、ContainsとIndexです。
たとえば「リンゴが好きです」という文章から「リンゴ」という言葉が含まれているかどうか調べることができます。検索というと難しく聞こえますが、実際には「探し物を見つける」イメージです。
2. Contains関数とは?
Contains関数は、指定した文字列の中に特定の文字列が含まれているかを判定します。結果はtrue(含まれる)かfalse(含まれない)の二択です。まるで部屋の中に「リンゴ」があるかをチェックするようなイメージです。
package main
import (
"fmt"
"strings"
)
func main() {
text := "私はGo言語を勉強しています"
result := strings.Contains(text, "Go")
fmt.Println(result)
}
true
この例では、「私はGo言語を勉強しています」という文字列に「Go」が含まれているため、結果はtrueになります。
3. Index関数とは?
Index関数は、指定した文字列が最初に現れる位置(インデックス)を返します。インデックスとは文字列の何文字目にあるかを示す番号で、0から数え始めます。
もし見つからなかった場合は、-1が返ります。これは「存在しない」という意味を持っています。
package main
import (
"fmt"
"strings"
)
func main() {
text := "私はGo言語を勉強しています"
index := strings.Index(text, "Go")
fmt.Println(index)
}
3
この場合、「Go」は文字列の4文字目(インデックスは0から数えるので3)に現れます。そのため結果は3です。
4. ContainsとIndexの違いを整理しよう
ここまでの説明を整理すると次のようになります。
Contains:文字列が含まれているかどうかを調べて、結果をtrueまたはfalseで返すIndex:文字列がどの位置にあるかを数値で返す。見つからない場合は-1
どちらを使うかは目的によって変わります。「あるかどうか」だけを知りたいならContains、「どこにあるか」も知りたいならIndexを選びます。
5. 実践的な活用例
ここでは、実際に日常的なシーンを想定した使い方を紹介します。
5-1. ユーザー入力のチェック
たとえば、ユーザーが入力したメールアドレスに@が含まれているかを調べることで、簡易的なバリデーション(正しいかどうかの確認)を行えます。
package main
import (
"fmt"
"strings"
)
func main() {
email := "sample@example.com"
if strings.Contains(email, "@") {
fmt.Println("正しい形式のメールアドレスです")
} else {
fmt.Println("メールアドレスの形式が間違っています")
}
}
正しい形式のメールアドレスです
5-2. キーワード検索機能
ブログの記事や商品の説明文の中から、ユーザーが検索したいキーワードが含まれているかどうかを判定する際にContainsは役立ちます。
5-3. 部分一致での情報処理
Indexを使うことで、文章中のどの位置に特定の単語があるかを調べ、さらにその部分だけを切り取るといった応用も可能です。
6. エラー処理と注意点
初心者の方が気をつけるべき点として、Indexが-1を返すケースがあります。これは検索した文字列が見つからなかった場合です。-1をそのまま使うとエラーにつながる可能性があるので、必ずチェックしてから利用しましょう。
package main
import (
"fmt"
"strings"
)
func main() {
text := "Go言語入門"
index := strings.Index(text, "Java")
if index == -1 {
fmt.Println("指定した文字列は見つかりませんでした")
} else {
fmt.Println("文字列は位置", index, "にあります")
}
}
指定した文字列は見つかりませんでした