💽

GoでByte型とuint8型を比較する

に公開

A Tour of GoでGo言語を学習中によくわからない型が出てきたのでアウトプットとしてまとめてみました。

Byte型とは?

一言でいうと byte型はuint8型の別名(エイリアス) です。
そのためuint8 と同じく0から255までの整数値を持ちます。

なぜ使うのか?

上記結論を知りuint8 型と全く同じならわざわざ用意する必要ないじゃん!っと僕は思いました。ですが流石に何の意味もなく用意されているわけではないので、使う理由を説明していきます。

データとして扱うことを明確にするため

プログラムの世界ではCPUが扱えるデータの最小単位が8bitであることから、バイナリデータを表す数字として0から255までの数字を扱いたいことが頻繁にあります。
このようなシーンにおいてバイナリデータをuint8型の変数に格納した場合、その変数がバイナリデータとして扱いたいのか、それとも単純な数値として扱いたいのかコードを書いている人間以外がすぐに判断することが難しいです。
一方でbyte型の変数に格納した場合、コードを読む人間はバイナリデータとして扱いたいとすぐ判断することができます。
このような理由からbyte型を使うことで明示的にデータとして変数を扱えるようになります。

基本的な使い方

byte型を使うときはバイナリデータとして変数を扱いたい時であり、ここではテキストファイルを作成してみます。
Go言語では一度テキストをバイナリデータに変換してから、ファイルに保存する必要があります。従って、簡単なテキストファイルを保存するコードは以下のようになります。

main.go
package main

import (
	"os"
)

func main() {
	// 保存する文字列
	str := "Hello Go!"
	//文字列をバイト列に変換
	bytes := []byte(str)

	//ファイルを出力 
	err := os.WriteFile("sample.txt", bytes, 0644)
	if err != nil{
		panic(err)
	}
}

byte型を扱うことでバイト列に変換することが明確になりましたね。
一方でuint8型を扱った場合はどうなるのでしょうか?以下のように変更してみます。

main.go
-	bytes := []byte(str)
+	bytes := []uint8(str)

どちらのコードでも機能上は全く問題ありませんが、コードを読む際にuint8型の場合一瞬混乱してしまいます。そのため基本的にバイナリデータを扱う際は基本的にbyte型として扱う方が、コードの読み手にとって親切になります。

まとめ

ここまでの内容をまとめます

  • byte型: 変数をバイナリデータとして扱いたい場合
  • uint8型: 変数を0から255までの数値として扱いたい場合

Discussion