Go言語の文字列の比較(==)と文字列比較関数を活用する例
生徒
「文字列同士を比べたいときはどうすればいいですか?」
先生
「Goではまず==演算子で等しいかどうかを調べます。さらに大文字小文字を無視した比較や、部分一致などには専用の関数を使います。」
生徒
「具体的にどんな関数を使うんですか?」
先生
「標準ライブラリのstringsパッケージに役立つ関数が揃っています。順に見ていきましょう。」
1. 基本:==演算子での比較
まず最も簡単なのは==演算子を使った比較です。これは二つのstringが完全に同じバイト列かどうかを判定します。英数字だけの比較や固定の文字列チェックに使います。
package main
import "fmt"
func main() {
a := "hello"
b := "hello"
fmt.Println(a == b) // true
}
注意点として、==は大文字小文字を区別します。"Hello"と"hello"は異なると判定されます。
2. 大文字小文字を無視して比較したいとき
ユーザー入力などで大文字小文字を気にせず比較したい場面があります。その場合はstrings.EqualFoldを使います。これはUnicode規則に従って大文字小文字を無視して比較します。
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.EqualFold("GoLang", "golang")) // true
}
この関数は国際化された文字(日本語以外のアルファベット系)にも適切に対応する点が利点です。
3. 部分一致や前方後方一致のチェック
文字列の一部が含まれているかや、先頭や末尾が特定の文字列かを調べるにはstrings.Contains、strings.HasPrefix、strings.HasSuffixを使います。
package main
import (
"fmt"
"strings"
)
func main() {
s := "example@example.com"
fmt.Println(strings.Contains(s, "@")) // true
fmt.Println(strings.HasPrefix(s, "http")) // false
fmt.Println(strings.HasSuffix(s, ".com")) // true
}
これらを組み合わせると、メールアドレスやURLの簡易検証などが簡単にできます。
4. 辞書順(辞書式)比較をしたいとき
二つの文字列を辞書順で比較して大小を知りたい場合はstrings.Compareやcompareの代替実装で扱えます。strings.Compareは比較結果を整数で返します(負なら左が小さい、ゼロなら等しい、正なら左が大きい)。
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.Compare("apple", "banana")) // -1
fmt.Println(strings.Compare("apple", "apple")) // 0
fmt.Println(strings.Compare("pear", "apple")) // 1
}
辞書順比較はソートや順位付けに使えます。ただしUnicodeの順序やロケール依存の順序を厳密に扱いたい場合は別途ライブラリが必要です。
5. 実用例:ユーザー入力の検証とトリミング
実際のアプリでは入力の前後に空白が入ることがあります。比較の前に余分な空白を取り除くためにstrings.TrimSpaceを使うと安全です。
package main
import (
"fmt"
"strings"
)
func main() {
input := " Admin "
if strings.EqualFold(strings.TrimSpace(input), "admin") {
fmt.Println("管理者として認識されました")
} else {
fmt.Println("一般ユーザーです")
}
}
この例では余分な空白を削除した上で大文字小文字を無視して比較しています。ユーザー名やパスワードのチェック、フォーム入力のバリデーションでよく使うパターンです。
6. 日本語やUnicodeを含む比較の注意点
日本語や絵文字を含む文字列の比較は、バイト列での比較と表示上の文字列が必ずしも一致しない場合があります。通常の等価チェックやEqualFoldで困る場面は少ないですが、正規化(例えば合字や濁点の扱い)を厳密にしたい場合はUnicode正規化を行うライブラリを検討してください。
7. まとめではなく最後に一言(注意点の確認)
要点を振り返ると、簡単な等価比較は==、大文字小文字無視はstrings.EqualFold、部分一致や接頭辞接尾辞の確認はstrings.Containsやstrings.HasPrefix/strings.HasSuffix、辞書順比較はstrings.Compareを使います。実運用ではTrimSpaceで前後の空白を削除してから比較する習慣をつけると安心です。