KDOC 426: string型の仕様を見る
この文書のステータス
- 作成
- 2025-08-08 貴島
- レビュー
- 2025-09-04 貴島
概要
Go言語には組み込みでstring型がある。言語仕様書を見ると、シンプルに書かれている。
↓string型はバイト列の並びにすぎない。ここでの言外の着目は、単に「バイト列」にだけ言及しているという点だ。並べ方(エンコーディング。UTF-8など)については一切言及していない。入れる中身に制約はない。
A string value is a (possibly empty) sequence of bytes.
— string typeから抜粋
import "fmt" func main() { abc := string([]byte{0x41, 0x42, 0x43}) fmt.Printf("%#v, ", abc) あ := string([]byte{0xe3, 0x81, 0x82}) fmt.Printf("%#v, ", あ) // UTF-8として無効 invalid := string([]byte{0xe3}) fmt.Printf("%#v, ", invalid) }
"ABC", "あ", "\xe3",
len()にstring型を引数にして実行するとバイト数が返ってくる(シーケンスが表現する「文字」数でなく)。string型は単なるバイト列だということを認識すると、一貫性のある挙動に見える。
↓いっぽうで、文字列リテラルは、「暗黙的にUTF-8エンコードである」と明記されている。
The value of a raw string literal is the string composed of the uninterpreted (implicitly UTF-8-encoded) characters between the quotes;
— string literalから抜粋
であるから、一般的なstring型を初期化する方法である文字列リテラル ""
でstring型の変数を初期化するとUTF-8の並びのバイト列になるのだが、string型にシーケンスに対する制限があるわけではない。
関連
なし。