KDOC 425: string型の仕様を見る

この文書のステータス

  • 作成
    • <署名>
  • レビュー
    • <署名>

概要

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型の変数を初期化するとUTF-8のバイト列になるのだが、string型にシーケンスに対する制限があるわけではない。

関連

なし。