len()について
func len(v Type ) int
len()は引数の型に応じて引数の長さを返す関数で、配列の要素数、スライスの要素数を返すことが可能です。
これを文字列に使用した場合の注意点として、取得できるのは文字数ではなく、引数のバイト数ということです。
つまり文字列に対してlen()を使用した場合、下記のような結果となります。
test.go
var string_jp = "あいうえお"
var string_en = "aiueo"
println("日本語文字数", len(string_jp))
println("英語文字数", len(string_en))
実行結果
日本語文字数 15
英語文字数 5
GO言語は標準でUTF-8(1文字あたり、1〜4バイトで表現する)が使用されており
多くの日本語:3バイト
半角英数字:1バイト
となるため、これでは文字数を正しく取得することが出来ません。
正しく文字数を取得するためには?
正しく文字数を取得するためには「unicode/utf-8」パッケージの[]rune()を使用する必要があります。
[]rune()
[]rune()はUnicodeのコードポイント(世界中の文字を16進数で表したもの)を取得することが可能で、1文字単位で文字数を取得することが出来ます。
実際に動かしてみると
test.go
var string_jp = "あいうえお"
var string_en = "aiueo"
println("日本語文字数", len([]rune(string_jp)))
println("英語文字数", len([]rune(string_en)))
実行結果
日本語文字数 5
英語文字数 5
となり正しい文字数を取得することができます。