Go/int64
表示
< Go
int64はGoにおいて事前宣言された符号付き64ビット整数型です。サイズは明確に定義されており、-9,223,372,036,854,775,808から9,223,372,036,854,775,807までの値を表現できます。
基本的な特徴
[編集]- 値の範囲: -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 (2^63-1)
- サイズ: 常に64ビット (8バイト)
- 符号: あり (signed)
- ゼロ値: 0
他のキーワードとの組み合わせ
[編集]型変換
[編集]var a int64 = 9000000000 var b int = int(a) // int64からintへの明示的変換(64ビットシステムでは安全、32ビットシステムではオーバーフロー可能性あり) var c float64 = float64(a) // int64からfloat64への変換 var d int32 = int32(a) // int64からint32への変換(注意:オーバーフローの可能性あり) var e string = strconv.FormatInt(a, 10) // int64から文字列への変換
定数との組み合わせ
[編集]const maxInt64 int64 = 9223372036854775807 const minInt64 int64 = -9223372036854775808 const trillion int64 = 1000000000000
型アサーション
[編集]var i interface{} = int64(123456789012345) if val, ok := i.(int64); ok { fmt.Println("値はint64型で:", val) }
型スイッチ
[編集]func checkType(i interface{}) { switch v := i.(type) { case int64: fmt.Println("これはint64型:", v) case int: fmt.Println("これはint型:", v) default: fmt.Println("これはint64型でもint型でもない") } }
ビット演算
[編集]var a int64 = 0x0F0F0F0F0F0F0F0F var b int64 = 0xF0F0F0F0F0F0F0F0 fmt.Printf("AND: %016X\n", a & b) // 0x0000000000000000 fmt.Printf("OR: %016X\n", a | b) // 0xFFFFFFFFFFFFFFFF fmt.Printf("XOR: %016X\n", a ^ b) // 0xFFFFFFFFFFFFFFFF fmt.Printf("左シフト: %016X\n", a << 4) // 0xF0F0F0F0F0F0F0F0 fmt.Printf("右シフト: %016X\n", a >> 4) // 0x00F0F0F0F0F0F0F
文字列変換
[編集]// 文字列からint64へ s := "9223372036854775807" n, err := strconv.ParseInt(s, 10, 64) if err == nil { fmt.Println("変換後の値:", n) } // int64から文字列へ var num int64 = 9223372036854775807 str := strconv.FormatInt(num, 10) fmt.Println("文字列化:", str)
ユースケース
[編集]- 大きな数値の処理
- 大きな整数演算が必要な金融計算
- 統計処理での大量データの集計
- 時間処理
- UNIXタイムスタンプ(ミリ秒やナノ秒を含む)
now := time.Now().UnixNano() // ナノ秒精度のUNIXタイムスタンプ(int64)
- ファイルサイズ操作
- 大きなファイルのサイズやオフセットの表現
info, _ := os.Stat("largefile.dat") size := info.Size() // int64型を返す
- ネットワークプログラミング
- トラフィック統計の集計
- 大量パケットの処理
- クリプトグラフィ
- 暗号化キーや大きな数値の操作
- ハッシュ関数の内部処理
- データベース
- 主キーやシーケンスとしての利用
- 行数の多いテーブルでの行番号
- 高精度測定
- 科学計算での大きな精度を必要とする場合
- センサーデータの長期集計
- IDとシーケンス生成
- 衝突しにくい大きなID値の生成
var lastID int64 atomic.AddInt64(&lastID, 1) // アトミックなカウンター
- パーフォーマンスモニタリング
- メモリ使用量の追跡
- 高分解能パフォーマンスカウンター
- 並行処理での同期
- アトミック操作でのカウンターやフラグ
var counter int64 atomic.AddInt64(&counter, 1) value := atomic.LoadInt64(&counter)
- 大規模データ処理
- ビッグデータ集計での合計値
- 大きな配列やスライスのインデックス
- 64ビットハッシュ値
- ハッシュマップでの高速検索
hash := fnv.New64() hash.Write([]byte("hello")) hashValue := hash.Sum64()
- ビットフィールド
- 最大64のブール値を単一の変数に格納
var flags int64 = 0 const ( FLAG1 int64 = 1 << iota FLAG2 FLAG3 // ... 最大64フラグ )
- 固定小数点演算
- 小数点を扱うための整数スケーリング
// 固定小数点(6桁精度) const scale int64 = 1000000 price := int64(123456789) // 123.456789を表す
注意点
[編集]- エンディアン:
int64は8バイトであるため、バイナリ操作時にはエンディアン(バイト順)に特に注意が必要ですbuf := make([]byte, 8) binary.LittleEndian.PutUint64(buf, uint64(value)) binary.BigEndian.PutUint64(buf, uint64(value))
- オーバーフロー: 範囲を超える演算ではオーバーフローが発生します
var a int64 = 9223372036854775807 a++ // オーバーフローで -9223372036854775808 になる
- 浮動小数点との変換精度: 大きな
int64値をfloat64に変換すると精度が失われる可能性がありますvar large int64 = 9223372036854775807 f := float64(large) back := int64(f) // 元の値と等しくない可能性がある
- メモリ使用量:
int64は8バイトを消費するため、大量のint64変数や配列を使用する場合はメモリ使用量が増加します// 1億要素のスライスで約800MBのメモリ使用 hugeArray := make([]int64, 100000000)
- 32ビットシステムでの考慮点: 32ビットシステムでも64ビット値として計算されますが、処理は通常遅くなります
- アライメント: 一部のアーキテクチャでは、64ビット値のメモリアライメントが性能に影響することがあります
- 環境依存性:
intがint32なのかint64なのかは実行環境に依存するため、ポータブルなコードでは明示的にint64を使用する方が安全です
Goでint64型を選択する際は、必要な値の範囲と精度、メモリ使用量、パフォーマンス要件のバランスを考慮することが重要です。特に大きな整数値や時間値、ファイルサイズなど広い範囲の値を扱う場合にint64型は適しています。