コンテンツにスキップ

Go/rune

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

Goのruneについて

[編集]

Goにおける rune は、Unicodeの1文字を表すint32型の別名です。Goの文字列はUTF-8でエンコードされたバイト列であり、マルチバイトの文字(たとえば日本語や絵文字)も含まれるため、文字(=Unicodeコードポイント)単位の処理を行う際には rune 型が重要です。

基本情報

[編集]
  • runeint32 のエイリアス(実体は int32
  • Unicodeのコードポイント(1文字)を表す
  • Go文字列はUTF-8エンコードのバイト列なので、1文字≠1バイト
  • rune 型は for range 文や []rune でよく使われる

他のキーワードとの組み合わせ

[編集]

変数宣言との組み合わせ

[編集]
var ch rune = '界'
letter := 'A'       // 型は rune

※ シングルクォート ' を使うと rune リテラル(Unicode 1文字)

定数定義との組み合わせ

[編集]
const Alpha rune = 'α'
const Tab = '\t'
const Smile = '😄'

関数パラメータと戻り値

[編集]
func IsHiragana(r rune) bool {
    return r >= 'ぁ' && r <= 'ん'
}

func ToRune(s string) rune {
    r, _ := utf8.DecodeRuneInString(s)
    return r
}

型変換

[編集]
s := string('あ')     // rune → string(1文字)
code := int32('あ')   // rune → int32(数値としてのコードポイント)

r := rune(65)        // int → rune('A')
s2 := string([]rune{'こ', 'ん', 'に', 'ち', 'は'}) // rune配列 → string

配列とスライス

[編集]
s := "こんにちは"
runes := []rune(s)         // 文字列 → runeスライス(文字単位で扱える)

runes[0] = 'さ'
s2 := string(runes)        // runeスライス → 文字列

マップ

[編集]
count := map[rune]int{}

for _, r := range "ごんぎつね" {
    count[r]++
}

構造体のフィールド

[編集]
type Token struct {
    Char  rune
    Pos   int
}

type TrieNode struct {
    Value rune
    Next  map[rune]*TrieNode
}

バイト処理・UTF-8との組み合わせ

[編集]
import "unicode/utf8"

func RuneCount(s string) int {
    return utf8.RuneCountInString(s)
}

func FirstRune(s string) rune {
    r, _ := utf8.DecodeRuneInString(s)
    return r
}

func EncodeRune(r rune) []byte {
    buf := make([]byte, utf8.RuneLen(r))
    utf8.EncodeRune(buf, r)
    return buf
}

エスケープ・リテラル

[編集]
a := 'あ'           // 1文字のruneリテラル
newline := '\n'     // 制御文字
quote := '\''       // エスケープされたシングルクォート

// 数値でruneを指定
code := rune(0x3042) // → 'あ'

一般的なユースケース

[編集]
  1. 文字列を1文字ずつ処理
s := "日本語"
for _, r := range s {
    fmt.Printf("%c %U\n", r, r)
}
  1. 文字の種類を判別(unicodeパッケージ)
import "unicode"

func IsLetterOrDigit(r rune) bool {
    return unicode.IsLetter(r) || unicode.IsDigit(r)
}
  1. rune単位での置換
func ReplaceAtoB(s string) string {
    runes := []rune(s)
    for i, r := range runes {
        if r == 'あ' {
            runes[i] = 'い'
        }
    }
    return string(runes)
}

rune 型は、Goで文字を正確に扱うための基本的な型です。文字列はUTF-8のバイト列であり、バイト単位では正しく1文字を処理できないことがあるため、runeを使うことで正しいUnicode処理が可能になります。rune 型を活用することで、国際化対応や日本語・絵文字の扱いも含めた堅牢な文字列処理が実現できます。