Go言語で文字列の長さやスライスの長さの取得方法。utf8.RuneCountInString関数を使う

Go言語で文字列の長さ、バイト数を調べたり、文字列からスライスで一部だけを取得する方法について解説します

Go言語で文字列の長さを取得する方法

Go言語で文字列の長さを取得するには、len関数やunicode/utf8パッケージのRuneCountInString関数を使います。

以下が文字列の長さを取得するサンプルコードです。


package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    // 文字列の定義
    s := "こんにちは"
    t := "hello"

    // バイト数を取得
    fmt.Println(len(s)) // 15
    fmt.Println(len(t)) // 5

    // 文字数を取得
    fmt.Println(utf8.RuneCountInString(s)) // 5
    fmt.Println(utf8.RuneCountInString(t)) // 5
}

注意が必要なのが日本語などのマルチバイト文字の取り扱いです。

len関数は文字列をバイト配列として扱って長さを返します。英語ならlenでも文字列の長さを取得してくれますが日本語だと文字列の長さと一致しません。

utf8パッケージのRuneCountInString関数は、文字列をUTF-8エンコードされたrune(文字)として扱って長さを返します。

Go言語で文字列をスライスで取得する

文字列からスライスを使って一部だけを切り出して取得する場合のサンプルコードはこちらです。


package main

import (
    "fmt"
)

func main() {
    // 文字列の定義
    s := "こんにちは"

    // スライスで最初の2文字を取得
    fmt.Println(s[:6]) // こん

    // スライスで最後の2文字を取得
    fmt.Println(s[9:]) // にち

    // スライスで中央の1文字を取得
    fmt.Println(s[6:9]) // は
}

文字列のスライスは[開始位置:終了位置]の形式でインデックスを指定します。

開始位置は含まれますが、終了位置は含まれないことに注意が必要です。Rubyも似たような感じですたよね。

インデックスはバイト単位で指定します。バイト単位なので日本語を扱う場合には注意が必要です。

おまけ

文字列から1文字だけを取得するならインデックス番号で指定するほうが簡単ですよ

Go言語の文字列からN番目の1文字を取得する。先頭や末尾など