Go/uint

Goのuintについて

Goにおけるuintは符号なし整数型で、プラットフォームのワードサイズ(32ビットシステムでは32ビット、64ビットシステムでは64ビット)に依存する組み込み型です。

基本情報

  • uintは常に正の値のみを扱います(0を含む)
  • サイズはプラットフォームに依存(uint = uint32 または uint64)
  • 値の範囲: 0 から 2^32-1(32ビットシステム)または 0 から 2^64-1(64ビットシステム)

固定サイズのuint型

Goには固定サイズのuint型もあります:

  • uint8: 8ビット符号なし整数(0~255)
  • uint16: 16ビット符号なし整数(0~65535)
  • uint32: 32ビット符号なし整数(0~4294967295)
  • uint64: 64ビット符号なし整数(0~18446744073709551615)
  • uintptr: ポインタを保持するのに十分な大きさの符号なし整数

他のキーワードとの組み合わせ

変数宣言との組み合わせ

var count uint = 10
count := uint(10) // 型推論による短縮形

定数定義との組み合わせ

const MAX_USERS uint = 1000

関数パラメータと戻り値

func increment(value uint) uint {
    return value + 1
}

型変換

i := 42
u := uint(i) // int から uint への変換

f := 3.14
u2 := uint(f) // float から uint への変換(小数点以下切り捨て)

配列とスライス

var numbers [5]uint // uint型の固定長配列
nums := make([]uint, 10) // uint型のスライス

マップ

ages := make(map[string]uint) // 名前から年齢へのマッピング

構造体のフィールド

type User struct {
    ID   uint
    Age  uint
    Rank uint
}

一般的なユースケース

  1. カウンタ/インデックス
       var counter uint = 0
       for i := uint(0); i < 10; i++ {
           counter += i
       }
    
  2. 配列・スライスのインデックス
       arr := [5]string{"a", "b", "c", "d", "e"}
       var index uint = 2
       fmt.Println(arr[index])
    
  3. ビット操作
       var flags uint = 0
       // ビットをセット
       flags |= 1 << 3
       // ビットをクリア
       flags &^= 1 << 2
       // ビットをチェック
       if (flags & (1 << 3)) != 0 {
           fmt.Println("3番目のビットがセットされています")
       }
    
  4. 正のサイズや容量
       func createBuffer(size uint) []byte {
           return make([]byte, size)
       }
    
  5. IDやハッシュ値の格納
       type Resource struct {
           ID uint
           Hash uint64
       }
    
  6. データ構造の実装
       type Queue struct {
           items []int
           head uint
           tail uint
           size uint
       }
    

注意点

  1. オーバーフロー: 最大値を超えると、0に戻ります(ラップアラウンド)
       var x uint8 = 255
       x++ // x は 0 になる
    
  2. 負の値との互換性: 負の値を代入しようとするとコンパイルエラーになります
       var u uint = -1 // コンパイルエラー
    
  3. int型との混合演算: 明示的な型変換が必要です
       var a int = 10
       var b uint = 20
       // c := a + b // コンパイルエラー
       c := a + int(b) // 正しい方法
    
  4. プラットフォーム依存性: コードのポータビリティを考慮する場合は、uintよりuint32uint64など固定サイズの型を使用することが推奨されます

uintを適切に使用することで、正の整数のみを扱う場面でのコードの明確さと安全性を向上させることができます。

カテゴリ:Go
カテゴリ:Go