Lapis Lazuli

technical blog for web developer

【Go】rune型という見慣れない型

以前、謎のrune型に遭遇しました。
ルーンと読むのですが、名前がカッコいいので印象に残りましたw

それは文字列を操作していた時に起こった

runeを初めてみたのはfor rangeで文字列を取り出していたときです。

mojiretu := "abcdefgh"

for _, v := range mojiretu {
    fmt.Println(v)  // 97, 98, 99 ....
}

という形で出力されたので?となり調べました。
どうやらruneという型で取り出されるらしく、出力すると上記のような文字列になります。
ではコイツの正体が何なのかを明らかにしていきたいと思います。

rune型とは

結論から言うとコードポイントで表現された値になります。
unicodeを扱いやすくする為、Goではコードポイントで表現されたrune型を使用する仕組みになっています。
runeの実態はint32になっていて、unicodeの4byte分を表現するのに十分なサイズということみたいです。

では上記のコードでコードポイントではなく文字自体を取り出したいときにはどうしたよいのでしょうか。

mojiretu := "abcdefgh"

for _, v := range mojiretu {
    fmt.Println(string(v))  // a, b, c ....
}

はい、単純にstringでキャストしてますねw
これだけで普通に出力されます。内部的にはコードポイントの値をキーに、当てはまるunicode文字列を取り出している感じですね。
特に複雑な処理を書くまでもなく変換出来るのはお手軽でいい感じです。
文字列から1文字取り出す処理を書く機会があれば、ぜひrune型に触れてみてください。