byte型
Go言語ではファイルの読み込みの際に以下のように、byte型の配列やスライスを扱っていることがよくあります。
buf := make([]byte, 64)
for {
n, err := fp.Read(buf)
if n == 0 {
break
}
if err != nil {
panic(err)
}
}
そもそもbyte型とは何でしょうか。
byte型
とはuint8型
の別名です。
uint8型は8bit、つまり1バイト分の表現が可能です。(10進数では 0~255)
分かりやすさの点から、1バイトを単位として処理を行う際にuint8ではなく、byte型を行うという慣習がGo言語ではあると考えられます。
型 | 最小値 | 最大値 |
---|---|---|
byte (uint8) | 0 | 255 |
uint16 | 0 | 65535 |
Go言語とUTF-8
Go言語では、文字型はUTF-8の文字列として扱われます。
UTF-8では、アルファベットは1バイトで表現可能です。
アルファベット | UTF-8 文字コード (16進数) | UTF-8 文字コード (10進数) |
---|---|---|
a | 61 | 97 |
b | 62 | 98 |
c | 63 | 99 |
また、ひらがなでは3バイトが必要になります。
ひらがな | UTF-8 文字コード (16進数) | UTF-8 文字コード (10進数) |
---|---|---|
あ | E3 81 82 | 227 129 130 |
い | E3 81 84 | 227 129 132 |
う | E3 81 86 | 227 129 134 |
string型を[ ]byte型に変換する
string型の文字列を []byte
で囲むことで
string型を[ ]byte型に変換することが可能です。
aという文字がbyte型では
10進数の文字コードで出力されていることが分かります。
func main() {
fmt.Println([]byte("abc")) // 出力: [97 98 99]
}
このように、文字列を扱う場合、1バイトを単位としていることが分かります。
そのため、文字列を扱った処理を行う際に、byte型を用いるということが多くなっています。
ひらがなは3バイトを必要としていることも分かります。
func main() {
fmt.Println([]byte("あ")) // 出力: [227 129 130]
}
[ ]byte型をstring型に変換する
先程とは逆で、
[]byte型のスライスや配列を string
で囲むことで
string型を[ ]byte型に変換することが可能です。
func main() {
byteslice_abc := []byte{97, 98, 99}
fmt.Println(string(byteslice_abc)) // 出力: abc
byteslice_あ := []byte{227, 129, 130}
fmt.Println(string(byteslice_あ)) // 出力: あ
}
(余談ですが、Go言語で変数名にひらがなを用いることができます。)