Posted at

Goで文字列の先頭から特定の文字数だけ切り取りたい

More than 3 years have passed since last update.

Goで文字列の先頭から特定の文字数だけを出力するのが、意外と悩んだのでちょっとメモします。

Goでは文字列はbyteのsliceのような扱いになります。なのでASCIIコードはいいのですが、UTF-8の文字列を適当に扱うと、UTF-8の文字列として不正なバイト列になることがあります(UTF-8は変なところで切ると必ず不正なバイト列になる)。

今回は『こんにちは』という文字列の先頭2文字だけを表示することを考えます。

package main

import (
"fmt"
"unicode/utf8"
)

func main() {
str := "こんにちは"

fmt.Println(len(str))
fmt.Println(utf8.RuneCountInString(str))
fmt.Println(str[:3])
fmt.Println(string([]rune(str)[:2]))
}

出力:

15

5

こん

文字列でlenを使うとバイト列としての長さが出るので、ひらがなだと文字数の3倍になるはずです。UTF-8の文字列としての長さを知りたい場合はutf8.RuneCountInStringを使う必要があります。

そしてruneというのがUTF-8の1文字を表すので、文字列をruneのsliceにキャストします。そうすれば先頭2文字を切り出す事はできるので、それをstringにキャストすればいいです。

もっと簡単にできる方法があれば、教えてくれるとうれしいです。