カテゴリ: Go言語 更新日: 2025/12/11

Go言語の文字列ループ処理!runeを使った文字単位の安全な繰り返し方法

Go言語の文字列のループ処理(runeを使った文字単位ループ)
Go言語の文字列のループ処理(runeを使った文字単位ループ)

先生と生徒の会話形式で理解しよう

生徒

「Go言語で日本語の文字列を1文字ずつ処理したいのですが、どうすればいいですか?」

先生

「文字列は内部的にバイト列として管理されているため、普通のループではマルチバイト文字が正しく扱えません。ここでruneを使う方法が有効です。」

生徒

「runeって何ですか?」

先生

runeはGoで文字を表す型で、Unicodeのコードポイントを格納します。これを使うと、日本語などのマルチバイト文字も正しく1文字ずつ処理できます。」

1. 文字列のループ処理で注意すること

1. 文字列のループ処理で注意すること
1. 文字列のループ処理で注意すること

Go言語では文字列はバイト列として扱われます。そのため、for i := 0; i < len(s); i++のように単純なインデックスでループすると、日本語や絵文字などのマルチバイト文字が途中で切れてしまうことがあります。これを避けるために、rune型を使った文字単位のループが推奨されます。

2. runeを使った基本的なループ

2. runeを使った基本的なループ
2. runeを使った基本的なループ

文字列をruneスライスに変換してからループすると、1文字ずつ正確に処理できます。


package main

import "fmt"

func main() {
    str := "こんにちは"
    for _, r := range str {
        fmt.Println(string(r))
    }
}

こ
ん
に
ち
は

このようにrangeを使うと、インデックスとruneを同時に取得できます。アンダースコア(_)はインデックスを無視するための書き方です。

3. インデックスも取得する方法

3. インデックスも取得する方法
3. インデックスも取得する方法

文字の位置も知りたい場合は、rangeでインデックスを取得します。インデックスはバイト単位で返されるので、注意が必要です。


package main

import "fmt"

func main() {
    str := "こんにちは"
    for i, r := range str {
        fmt.Printf("バイト位置 %d: 文字 %s\n", i, string(r))
    }
}

バイト位置 0: 文字 こ
バイト位置 3: 文字 ん
バイト位置 6: 文字 に
バイト位置 9: 文字 ち
バイト位置 12: 文字 は

日本語の1文字は複数バイトで表現されるため、バイト位置が3ずつ増えています。これはUTF-8で文字がエンコードされているためです。

Go言語を基礎からスッキリ学びたい人や、 文法だけでなく「実用的な使い方」まで押さえたい人には、 定番の入門書がこちらです。

基礎からわかるGo言語をAmazonで見る

※ Amazon広告リンク

4. 文字単位ループの応用例

4. 文字単位ループの応用例
4. 文字単位ループの応用例

文字列内の文字を1つずつ処理することで、文字のカウントや特定文字の置換、文字の検証などに活用できます。


package main

import "fmt"

func main() {
    str := "Go言語は楽しい"
    count := 0
    for _, r := range str {
        if r == '楽' {
            count++
        }
    }
    fmt.Printf("'楽'の出現回数: %d\n", count)
}

'楽'の出現回数: 1

このようにruneを使うことで、文字単位で安全に処理できるため、マルチバイト文字を含む文字列でも正確に操作できます。

5. パフォーマンスを意識した文字列ループ

5. パフォーマンスを意識した文字列ループ
5. パフォーマンスを意識した文字列ループ

文字列が非常に長い場合、runeスライスに変換する処理はメモリを使います。頻繁に文字単位で操作する場合は、必要に応じてrangeで直接処理するか、処理の回数を減らすなど工夫しましょう。

6. ポイントを整理

6. ポイントを整理
6. ポイントを整理
  • Go言語の文字列はバイト列で管理されている
  • 日本語や絵文字は複数バイトで表現されるので単純ループでは危険
  • runeを使うと文字単位で安全にループできる
  • rangeでインデックスと文字を取得可能
  • 長い文字列を扱う場合はメモリとパフォーマンスに注意

まとめ

まとめ
まとめ

この記事では、Go言語における文字列処理の中でもとくに重要な「runeを使った文字単位のループ」について詳しく学びました。 日本語や絵文字といったマルチバイト文字を扱う際、単純にインデックスでループしてしまうと文字が途中で切れてしまう危険があります。 そのため、Unicodeを意識した安全な文字処理が欠かせず、Go言語ではそのための型としてruneが用意されています。 runeは1文字を正しく表現できるため、UTF-8環境でも確実に文字単位で処理できるというメリットがあります。

また、rangeによるループは、内部的に文字列をUnicodeのコードポイントとして処理してくれるため、 プログラマが特別な処理を追加しなくても自然に1文字ずつ正しく扱えるという利便性があります。 これは日本語などの多バイト文字を頻繁に扱うアプリケーションでは大きな強みで、 チャットアプリ、テキスト解析、検索エンジン向けの整形処理など、多くの用途で役立ちます。 特に、文章を形態素レベルで処理したり、特定の文字を見つけたり、テキストを段階的に整形する場面では非常に効果的です。

しかし、runeを使う際にはメモリ消費にも注意が必要です。 runeスライスへ変換すると文字列の長さに比例した領域が確保されるため、 長大なテキストを処理する場合は変換を最小限に留めたり、rangeを直接使うなど適切な選択をすることが大切です。 実際のプロダクト開発では、性能と可読性のバランスを考えながら実装方法を決める習慣が求められます。

まとめ用サンプル:文字列から特定の文字だけを抜き出す処理

ここでは、学んだ内容を活かして「文字列の中からひらがなだけを抽出する」という例を紹介します。 日本語の中には漢字・カタカナ・記号などさまざまな種類が混在するため、文字単位の厳密な判定が必要になります。 そのためにもruneによるループが有効です。


package main

import (
    "fmt"
    "unicode"
)

func main() {
    str := "Go言語はとてもたのしい!"
    result := ""

    for _, r := range str {
        if unicode.In(r, unicode.Hiragana) {
            result += string(r)
        }
    }

    fmt.Println("抽出されたひらがな:", result)
}

抽出されたひらがな: とてもたのしい

このように、文字単位での安全な繰り返し処理ができると、言語処理や文章の解析など、実践的なプログラミングでも活用できる幅が一気に広がります。 特定文字のフィルタリング、文字種の判定、自然言語処理の前処理など、さまざまな応用が可能になります。 Go言語の標準パッケージにはunicodeといった便利な判定機能も備わっているため、それらと組み合わせることで強力な文字処理が実現できます。

さらに理解を深めるための考え方

・Go言語の文字列はバイト列であることを常に意識する
・文字単位の正確な処理には必ずruneが必要になる
・rangeループは自動的にUnicode単位で処理してくれる便利な方法
・文字の位置(インデックス)はバイト位置である点に注意
・unicodeパッケージを併用することで文字種判定が柔軟にできる
・長いテキストでは性能を考えて無駄な処理を減らす工夫が必要

これらを意識しておくことで、文字列を扱うプログラムの品質は大きく向上します。 日本語や絵文字、特殊記号などを含むデータを正しく扱えるということは、ユーザーが安心して使えるアプリケーションにつながるからです。

先生と生徒の振り返り会話

生徒

「runeを使うことで、日本語も1文字ずつ正しく処理できることがよくわかりました!」

先生

「その通りです。マルチバイト文字を安全に扱えるというのはとても大切なポイントです。 特に日本語の文章を扱うプログラムでは欠かせませんね。」

生徒

「rangeで文字単位にループできるのも便利ですね。unicodeパッケージと組み合わせるともっと応用できそうです。」

先生

「ええ、その通りです。ひらがな・カタカナ・漢字の判定、絵文字の検出など、いろいろな処理に応用できます。 今日学んだruneの基本は、これからの文字列処理の土台になりますよ。」

生徒

「もっと複雑な操作にも挑戦してみます!ありがとうございました!」

カテゴリの一覧へ
新着記事
New1
Go言語
Go言語の構造体の初期化パターンとコンストラクタ的関数の書き方を徹底解説!初心者でもわかる基本と実用例
New2
Kotlin
Kotlinの例外処理とキャンセルの連携を完全ガイド!初心者でもわかるCoroutineExceptionHandlerの使い方
New3
Go言語
Go言語のクロージャとは?関数内関数の活用例と仕組み
New4
Swift
Swiftでエラー原因を可視化!ログとトレースのベストプラクティスを初心者向けに解説
人気記事
No.1
Java&Spring記事人気No1
Kotlin
KotlinのChannelでデータをやり取りする方法を完全ガイド!初心者にもわかる非同期通信の基本
No.2
Java&Spring記事人気No2
Go言語
Go言語でのDB接続情報を環境変数で管理する方法|初心者でも安全に設定
No.3
Java&Spring記事人気No3
Kotlin
Kotlinのビルド設定エラーと解決法まとめ!初心者向けGradleトラブル対処ガイド
No.4
Java&Spring記事人気No4
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.5
Java&Spring記事人気No5
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.6
Java&Spring記事人気No6
Kotlin
Kotlinでテキスト表示・編集!初心者でもわかるTextViewとEditTextの使い方
No.7
Java&Spring記事人気No7
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方
No.8
Java&Spring記事人気No8
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方

💻 作業効率アップに

ノートPCを縦置きしてデスクを広く。
省スペースで片づく定番スタンド

UGREEN 縦型スタンドをAmazonで見る

※ Amazon広告リンク