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
このコードから、s
とclone
は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
このコードから、b
はa
より大きく、い
はあ
より大きく、あ
は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
関数までを見ていきました。便利そうなものもあり、とても勉強になりました。
機会があったらこれらを使ってわかりやすいコードを書いていきたいです。
この記事を書いた人
-
これまで農業、士業と経験し、まったく異業種のエンジニアとしてアーティスに入社。
現在は事業開発部でバックエンドエンジニアとして仕事に従事。可読性の高いコードが書けるよう日々勉強中。趣味は一人旅。
この執筆者の最新記事
関連記事
最新記事
FOLLOW US
最新の情報をお届けします
- facebookでフォロー
- Twitterでフォロー
- Feedlyでフォロー