38
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Go言語】byte型ってなんだ

Last updated at Posted at 2021-07-18

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言語で変数名にひらがなを用いることができます。)

38
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?