【Go言語】文字列からN番目の1文字を取得する。先頭や末尾など位置を指定。rune型も

Go言語で文字列のなかで先頭の1文字だけ、2番目の1文字だけ、最後の1文字だけを取得したい場合ありますよね。

今回はこの文字列から1文字を取得する方法について解説します。

文字列からN番目の1文字を取得

Go言語では文字列は配列のようにインデックス番号をしていしてその文字を取得するこができます。文字をインデックスで取得するには、Index関数や文字列のインデックス演算子を使うことができます

例えば、以下のようなコードで文字列の文字をインデックスで取得できます。

package main

import (
    "fmt"
    "strings"
)

func main() {
    // 文字列の定義
    s := "Hello, world!"

    // 文字列のインデックス演算子で文字を取得
    fmt.Printf("%c\n", s[0]) // H
    fmt.Printf("%c\n", s[7]) // w

    // Index関数で部分文字列のインデックスを取得
    i := strings.Index(s, "world")
    fmt.Println(i) // 7

    // Index関数で見つからない場合は-1を返す
    j := strings.Index(s, "golang")
    fmt.Println(j) // -1
}

文字列の先頭はインデックス番号が0だから簡単ですね。

逆に文字列の最後の1文字を取得するにはスライスやrune型を使います。

サンプルコードはこちらです。

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

    // スライスで最後の1文字を取得
    fmt.Println(s[len(s)-1:]) // は

    // rune型に変換して最後の1文字を取得
    r := []rune(s)
    fmt.Println(string(r[len(r)-1])) // は
}

rune型について

Go言語には、Unicode文字を表現するための特別なデータ型としてrune型があります。rune型は、int32型のエイリアスであり、Unicodeコードポイントを表現するために使用されます。

Unicodeは、世界中の多言語で使用される文字セットを表現する標準的な方法であり、それぞれの文字には独自のコードポイントが割り当てられています。rune型は、このようなUnicodeコードポイントを表現するために使用され、1つのrune値は、1つのUnicodeコードポイントを表します。

Go言語では、文字列型stringは、内部的にruneのスライスとして表現されます。したがって、string型の値は、Unicode文字列を簡単に操作することができます。例えば、以下のようにrange文を使用して、string型の文字列をループ処理することができます。

str := "こんにちは世界"
for _, ch := range str {
    fmt.Println(ch)
}

range文は、string型の値に対して使用された場合、1つのループで1つのrune型の値を返します。

また、rune型の値をint型に変換することもできます。これは、rune型の値をUnicodeコードポイントとして扱う必要がある場合に便利です。以下のように、int関数を使用して、rune型の値をint型に変換することができます。

ch := 'A'
codepoint := int(ch)
fmt.Printf("'%c'のUnicodeコードポイントは%dです。\n", ch, codepoint)