コンテンツにスキップ

Go/int64

出典: フリー教科書『ウィキブックス(Wikibooks)』
< 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)

ユースケース

[編集]
  1. 大きな数値の処理
    • 大きな整数演算が必要な金融計算
    • 統計処理での大量データの集計
  2. 時間処理
    • UNIXタイムスタンプ(ミリ秒やナノ秒を含む)
    now := time.Now().UnixNano() // ナノ秒精度のUNIXタイムスタンプ(int64)
    
  3. ファイルサイズ操作
    • 大きなファイルのサイズやオフセットの表現
    info, _ := os.Stat("largefile.dat")
    size := info.Size() // int64型を返す
    
  4. ネットワークプログラミング
    • トラフィック統計の集計
    • 大量パケットの処理
  5. クリプトグラフィ
    • 暗号化キーや大きな数値の操作
    • ハッシュ関数の内部処理
  6. データベース
    • 主キーやシーケンスとしての利用
    • 行数の多いテーブルでの行番号
  7. 高精度測定
    • 科学計算での大きな精度を必要とする場合
    • センサーデータの長期集計
  8. IDとシーケンス生成
    • 衝突しにくい大きなID値の生成
    var lastID int64
    atomic.AddInt64(&lastID, 1) // アトミックなカウンター
    
  9. パーフォーマンスモニタリング
    • メモリ使用量の追跡
    • 高分解能パフォーマンスカウンター
  10. 並行処理での同期
    • アトミック操作でのカウンターやフラグ
    var counter int64
    atomic.AddInt64(&counter, 1)
    value := atomic.LoadInt64(&counter)
    
  11. 大規模データ処理
    • ビッグデータ集計での合計値
    • 大きな配列やスライスのインデックス
  12. 64ビットハッシュ値
    • ハッシュマップでの高速検索
    hash := fnv.New64()
    hash.Write([]byte("hello"))
    hashValue := hash.Sum64()
    
  13. ビットフィールド
    • 最大64のブール値を単一の変数に格納
    var flags int64 = 0
    const (
        FLAG1 int64 = 1 << iota
        FLAG2
        FLAG3
        // ... 最大64フラグ
    )
    
  14. 固定小数点演算
    • 小数点を扱うための整数スケーリング
    // 固定小数点(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ビット値のメモリアライメントが性能に影響することがあります
  • 環境依存性: intint32なのかint64なのかは実行環境に依存するため、ポータブルなコードでは明示的にint64を使用する方が安全です

Goでint64型を選択する際は、必要な値の範囲と精度、メモリ使用量、パフォーマンス要件のバランスを考慮することが重要です。特に大きな整数値や時間値、ファイルサイズなど広い範囲の値を扱う場合にint64型は適しています。