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型にシーケンスに対する制限があるわけではない。

関連

なし。