Go Academy · レッスン

Runeとバイト

Goの文字列内部を理解します

レッスン 1/413 ステップ

「Runeとバイト」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

Goの文字列とは

Goのstringは不変なバイト列です。バイト列には通常UTF-8でエンコードされたテキストが格納されますが、Goがそれを強制することはありません。

  • 文字列をその場で変更することはできません。
  • lenが数えるのは文字ではなくバイトです。
package main

import "fmt"

func main() {
    s := "Go"
    fmt.Println(s)
    fmt.Println(len(s))
}

内部ではバイトとして扱われる

文字列をs[i]でインデックス指定すると、単一のバイト(型はbyte、uint8のエイリアス)が返されます。

プレーンなASCIIテキストでは、各文字は必ず1バイトです。

package main

import "fmt"

func main() {
    s := "ABC"
    fmt.Println(s[0])
    fmt.Println(s[1])
    fmt.Println(s[2])
}

byteは数値

バイトは単なる数値なので、s[0]を出力すると文字ではなく、AのASCIIコードである65が表示されます。

文字を確認するには、バイトを再び文字列に変換してください。

package main

import "fmt"

func main() {
    s := "ABC"
    fmt.Println(string(s[0]))
}

runeとは何か

runeはint32のエイリアスで、単一のUnicodeコードポイントを表します。

  • UTF-8でエンコードすると、1つのruneが複数のバイトにまたがることがあります。
  • 生のバイトではなく文字を扱う場合はruneを使用します。
package main

import "fmt"

func main() {
    var r rune = 'A'
    fmt.Println(r)
    fmt.Println(string(r))
}

マルチバイト文字

ASCII以外の文字は、UTF-8では1バイトより多くのバイトを使用します。"héllo"のような文字列は、文字数よりもバイト数のほうが多くなります。

lenが報告するのはバイト数であり、目に見える長さより大きくなることに注意してください。

package main

import "fmt"

func main() {
    s := "héllo"
    fmt.Println(len(s))
}

文字列に対するrange

文字列に対するfor rangeループは、UTF-8を自動的にデコードします。各反復では次の値が得られます。

  • runeが始まるバイトインデックス
  • そのrune自体
package main

import "fmt"

func main() {
    for i, r := range "héllo" {
        fmt.Println(i, string(r))
    }
}

文字数を正しく数える

バイト数ではなく文字数を数えるには、文字列を[]runeに変換して、その長さを取得します。

これにより、コードポイントの数が得られます。

package main

import "fmt"

func main() {
    s := "héllo"
    runes := []rune(s)
    fmt.Println(len(runes))
}

runeによるインデックス指定

[]runeに変換すると、マルチバイトテキストでもN番目の文字を確実に取得できます。

package main

import "fmt"

func main() {
    runes := []rune("héllo")
    fmt.Println(string(runes[1]))
}

文字列とバイトの相互変換

文字列と[]byteは自由に相互変換できます。

  • []byte(s)は生のバイト列を返します。
  • string(b)はテキストを再構築します。
package main

import "fmt"

func main() {
    b := []byte("Go")
    fmt.Println(b)
    fmt.Println(string(b))
}

runeからの文字列構築

runeのスライスも同じ方法で文字列に戻せます。文字を個別に編集した後に便利です。

package main

import "fmt"

func main() {
    runes := []rune{'G', 'o', '!'}
    fmt.Println(string(runes))
}

バイトとruneのまとめ

簡単なイメージを持っておきましょう。

  • byte = 1つの生バイト(uint8)。len(s)はこれらを数えます。
  • rune = 1つのUnicodeコードポイント(int32)。rangeはこれらを生成します。
  • 文字を数えたりインデックス指定したりする場合は[]runeを使用します。
package main

import "fmt"

func main() {
    s := "café"
    fmt.Println(len(s))
    fmt.Println(len([]rune(s)))
}

クイックチェック

runeとバイトについての理解度を確認しましょう。

まとめ:runeとバイト

Goの文字列は通常UTF-8で表現される不変なバイト列であることを学びました。

  • byteは生のバイトで、lenはバイト数を数えます。
  • runeはUnicodeコードポイントで、rangeはそれらをデコードします。
  • 適切な単位で扱うには、[]byte(s)と[]rune(s)で変換します。
package main

import "fmt"

func main() {
    s := "Go語"
    fmt.Println("bytes:", len(s))
    fmt.Println("runes:", len([]rune(s)))
}
無料で開始

AI チューターと学ぶ Go — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「Runeとバイト」レッスンは無料ですか?

はい。「Runeとバイト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「Runeとバイト」で何を学びますか?

Goの文字列内部を理解します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Runeとバイト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Runeとバイト
  2. stringsパッケージの関数
  3. strings.Builder
  4. Unicodeとutf8
← Go Academyに戻る