グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



Go言語の標準ライブラリstringsパッケージについて調べてみた ~その1~

今回は、標準ライブラリについて理解を深めようと思いstringsパッケージについて調べてみました。

stringsパッケージは、文字列操作を簡単かつ効率的に行うための豊富な機能を提供しているようです。文字列を操作する機会は多いと思うので、良い勉強になりそうです。

stringsパッケージ内の機能と使用例についてまとめてみました。

Clone

Clone関数は、引数sの新しいコピーを返します。このコピーは新しい領域に作成されるようです。
また、説明文を読んでいくと必要な場合のみ使うべきと書かれていました。どういった時が必要な場合なのでしょうか。大きな文字列を受け取り、そこから必要な文字列だけをコピーし、受け取った大きな文字列は破棄する場合などでしょうか。

実際にCloneを使ってコードを書いてみます。内容はstringsパッケージのドキュメントのExampleに書かれている内容と同じです。

s := "abc"
clone := strings.Clone(s)
fmt.Println(s == clone)                                       // true
fmt.Println(unsafe.StringData(s) == unsafe.StringData(clone)) // false

このコードから、scloneはstringとしては同じ値、データとして別物であることがわかります。

Compare

Compare関数は二つの文字列を比較するために使用されます。この関数は以下のいずれかのintの値を返します。

  • 二つの文字列が等しい場合は0
  • 最初の文字列が二番目の文字列より小さい場合は-1
  • 最初の文字列が二番目の文字列より大きい場合は1

Compareを使ったコードは以下のとおり

fmt.Println(strings.Compare("a", "b")) // -1
fmt.Println(strings.Compare("a", "a")) // 0
fmt.Println(strings.Compare("b", "a")) // 1

fmt.Println(strings.Compare("あ", "い")) // -1
fmt.Println(strings.Compare("a", "あ")) // -1

このコードから、baより大きく、より大きく、aより大きいことがわかります。

Contains

Contains関数は、特定の文字列が含まれているかを判定するようです。

fmt.Println(strings.Contains("english", "ng")) // true
fmt.Println(strings.Contains("english", "gn")) // false
fmt.Println(strings.Contains("english", ""))   // true
fmt.Println(strings.Contains("", ""))          // true

二つ目の引数に空文字列を指定した場合は、一つ目の引数の値に関わらずtrueになるようです。

ContainsAny

fmt.Println(strings.ContainsAny("english", "ng")) // true
fmt.Println(strings.ContainsAny("english", "gn")) // true
fmt.Println(strings.ContainsAny("english", "i"))  // true
fmt.Println(strings.ContainsAny("english", "z"))  // false
fmt.Println(strings.ContainsAny("english", ""))   // false
fmt.Println(strings.ContainsAny("", ""))          // false

ContainsAny関数は、二つ目の引数に指定された文字列のどれか一文字でも一つ目の引数に含まれていればtrueを返すようです。Containsと違い、二つ目の引数に空文字列を指定するとfalseになります。

ContainsFunc

ContainsFunc関数は、containsの判定を関数で渡せるようです。実際に書いて試してみます。

f := func(r rune) bool {
    return r == 'a' || r == 'b' || r == 'c' || r == 'd'
}
fmt.Println(strings.ContainsFunc("hello", f)) // false
fmt.Println(strings.ContainsFunc("world", f)) // true
fmt.Println(strings.ContainsFunc("ab", f))    // true
fmt.Println(strings.ContainsFunc("", f))      // false

ContainsRune

ContainsRune関数は、runeを指定して文字列に含まれているかを判定するようです。

fmt.Println(strings.ContainsRune("abcdefg", 'a')) // true
fmt.Println(strings.ContainsRune("abcdefg", 97))  // true
fmt.Println(strings.ContainsRune("abcdefg", 'x')) // false
fmt.Println(strings.ContainsRune("abcdefg", 1))   // false

第二引数にはrune型を渡します。'a'のようなルーンリテラルはもちろん、97といった整数リテラルを渡すこともできます。念のため'a'rune(97)が等しいか調べておきます。

fmt.Println('a' == rune(97)) // true

runeの使い方に慣れていないと少し難しく感じます。

さいごに

今回はstringsパッケージのClone関数からContainsRune関数までを見ていきました。便利そうなものもあり、とても勉強になりました。

機会があったらこれらを使ってわかりやすいコードを書いていきたいです。

この記事を書いた人

wanderlust
wanderlust事業開発部 web application engineer
これまで農業、士業と経験し、まったく異業種のエンジニアとしてアーティスに入社。
現在は事業開発部でバックエンドエンジニアとして仕事に従事。可読性の高いコードが書けるよう日々勉強中。趣味は一人旅。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします