導入
Go言語で開発を行う際、数値型といえばデフォルトでint型を使うことが多いかと思います。しかし、メモリ効率を極限まで高める必要があるシステム開発や、ネットワーク越しに特定のバイト数でデータをシリアライズする際には、小さなデータ型を適切に選ぶことが非常に重要です。今回は、最小の整数型である「int8型」について解説します。
基礎知識
int8型は「8ビット符号付き整数」を指します。コンピュータのメモリは「ビット」という単位で管理されており、8ビットは「1バイト」に相当します。つまり、int8型を使用すると、メモリ上でわずか1バイトしか消費しません。
符号付きであるため、プラスとマイナスの両方を扱えます。表現できる値の範囲は、-128から127までとなります。この範囲を超えた値を代入しようとすると、コンパイルエラーになるか、意図しない値(オーバーフロー)になる可能性があるため注意が必要です。
実装/解決策
int8型を有効活用する場面は、主に以下の2点です。
1. 大量の数値を格納する構造体で、メモリ使用量を抑えたい場合
2. 通信プロトコルなどで、1バイト単位のデータ型が指定されている場合
Go言語では型変換が厳格です。int型やint32型からint8型へ代入する場合は、明示的なキャスト(型変換)が必要になります。
サンプルプログラム
以下のコードをコピーして、実際に動作を確認してみてください。
package main
import (
“fmt”
)
func main() {
// int8型の変数を宣言(初期値は0)
var smallNumber int8 = 100
// 範囲内の値を代入する
smallNumber = 127
fmt.Printf(“値: %d, メモリサイズ: %d byte\n”, smallNumber, unsafe.Sizeof(smallNumber))
// 計算結果が範囲を超えないように注意が必要
var a int8 = 60
var b int8 = 60
sum := a + b // 結果は120となり、int8の範囲(-128〜127)内に収まる
fmt.Printf(“計算結果: %d\n”, sum)
// 型変換の例:int型からint8型へ変換する
var largeInt int = 50
var converted int8 = int8(largeInt)
fmt.Printf(“変換後の値: %d\n”, converted)
}
// 補足: unsafeパッケージを使用するため、import “unsafe” が必要です。
応用・注意点
int8型を使用する際に最も陥りやすい罠は「オーバーフロー」です。例えば、127に1を足すと、期待する128にはならず、負の数(-128)に反転してしまいます。これはコンピュータのビット演算の仕組み上、8ビット目の符号ビットが変化するためです。
また、頻繁にint8型同士で演算を行うと、その都度int型への変換やキャストが発生し、コードが冗長になることがあります。可読性とメモリ効率のどちらを優先すべきか、チーム内で基準を設けておくことをおすすめします。基本的には、構造体やバイナリデータでの保持に限定し、計算処理には標準のint型を使うのがGo言語におけるベストプラクティスです。

コメント