Runeとバイト
Goの文字列内部を理解します
「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フィードバックを取得できます。ローカル設定は不要です。