gRPC - Protocol Buffers データ型 メモ

## はじめに
しっかりと翻訳したり使い方を補足説明するものではありません。
自分が見やすいように言語ごとにテーブルを分けただけのものになります。

引用元の情報は下記リンクから。
参考）[Language Guide (proto3) - Scalar Value Types](https://developers.google.com/protocol-buffers/docs/proto3#scalar)

## Java
| .proto | Notes | Java |
|:--|:--|:--| 
| double | 8byte小数。 | double  |
| float | 4byte小数。 | float |
| int32 | 0以上の整数ならこっち。（符号付） | int |
| int64 | 0以上の整数ならこっち。（符号付） | long |
| uint32 | 0以上の整数ならこっち。（符号なし） | int |
| uint64 | 0以上の整数ならこっち。（符号なし） | long |
| sint32 | 負の値があるときはこっちが効率的。 | int |
| sint64 | 負の値があるときはこっちが効率的。 | long |
| fixed32 | 4byte固定。 228を超える値の時unit32よりも効率的になることがある。 | int[1] |
| fixed64 | 8byte固定。 256を超える値の時unit64よりも効率的になることがある。 | long[1] |
| sfixed32 | 4byte固定。 | int |
| sfixed64 | 8byte固定。 | long |
| bool | 真偽値。 | boolean |
| string | UTF-8またはASCIIの文字情報。 | String |
| bytes | 任意のバイトシーケンス。 | ByteString |

[1] Javaでは、符号なしの32ビットおよび64ビットの整数は、符号付きの対応部分を使用して表され、最上位ビットは単純に符号ビットに格納されます。

## C++
| .proto | Notes | C++ |
|:--|:--|:--| 
| double | 8byte小数。 | double  |
| float | 4byte小数。 | float |
| int32 | 0以上の整数ならこっち。（符号付） | int32 |
| int64 | 0以上の整数ならこっち。（符号付） | int64 |
| uint32 | 0以上の整数ならこっち。（符号なし） | uint32 |
| uint64 | 0以上の整数ならこっち。（符号なし） | uint64 |
| sint32 | 負の値があるときはこっちが効率的。 | int32 |
| sint64 | 負の値があるときはこっちが効率的。 | int64 |
| fixed32 | 4byte固定。 228を超える値の時unit32よりも効率的になることがある。 | uint32 |
| fixed64 | 8byte固定。 256を超える値の時unit64よりも効率的になることがある。 | uint64 |
| sfixed32 | 4byte固定。 | int32 |
| sfixed64 | 8byte固定。 | int64 |
| bool | 真偽値。 | bool |
| string | UTF-8またはASCIIの文字情報。 | string |
| bytes | 任意のバイトシーケンス。 | string |

## Python
| .proto | Notes | Python[2] |
|:--|:--|:--| 
| double | 8byte小数。 | float  |
| float | 4byte小数。 | float |
| int32 | 0以上の整数ならこっち。（符号付） | int |
| int64 | 0以上の整数ならこっち。（符号付） | int/long[3] |
| uint32 | 0以上の整数ならこっち。（符号なし） | int/long[3] |
| uint64 | 0以上の整数ならこっち。（符号なし） | int/long[3] |
| sint32 | 負の値があるときはこっちが効率的。 | int |
| sint64 | 負の値があるときはこっちが効率的。 | int/long[3] |
| fixed32 | 4byte固定。 228を超える値の時unit32よりも効率的になることがある。 | int/long[3] |
| fixed64 | 8byte固定。 256を超える値の時unit64よりも効率的になることがある。 | int/long[3] |
| sfixed32 | 4byte固定。 | int |
| sfixed64 | 8byte固定。 | int/long[3] |
| bool | 真偽値。 | bool |
| string | UTF-8またはASCIIの文字情報。 | str/unicode[4] |
| bytes | 任意のバイトシーケンス。 | str |

[2] In all cases, setting values to a field will perform type checking to make sure it is valid.

[3] 64-bit or unsigned 32-bit integers are always represented as long when decoded, but can be an int if an int is given when setting the field. In all cases, the value must fit in the type represented when set. See [2].

[4] Python strings are represented as unicode on decode but can be str if an ASCII string is given (this is subject to change).

## Go

| .proto | Notes | Go |
|:--|:--|:--| 
| double | 8byte小数。 | float64  |
| float | 4byte小数。 | float32 |
| int32 | 0以上の整数ならこっち。（符号付） | int32 |
| int64 | 0以上の整数ならこっち。（符号付） | int64 |
| uint32 | 0以上の整数ならこっち。（符号なし） | uint32 |
| uint64 | 0以上の整数ならこっち。（符号なし） | uint64 |
| sint32 | 負の値があるときはこっちが効率的。 | int32 |
| sint64 | 負の値があるときはこっちが効率的。 | int64 |
| fixed32 | 4byte固定。 228を超える値の時unit32よりも効率的になることがある。 | uint32 |
| fixed64 | 8byte固定。 256を超える値の時unit64よりも効率的になることがある。 | uint64 |
| sfixed32 | 4byte固定。 | int32 |
| sfixed64 | 8byte固定。 | int64 |
| bool | 真偽値。 | bool |
| string | UTF-8またはASCIIの文字情報。 | string |
| bytes | 任意のバイトシーケンス。 | []byte |

## Ruby
| .proto | Notes | Ruby |
|:--|:--|:--| 
| double | 8byte小数。 | Float  |
| float | 4byte小数。 | Float |
| int32 | 0以上の整数ならこっち。（符号付） | Fixnum or Bignum (as required) |
| int64 | 0以上の整数ならこっち。（符号付） | Bignum |
| uint32 | 0以上の整数ならこっち。（符号なし） | Fixnum or Bignum (as required) |
| uint64 | 0以上の整数ならこっち。（符号なし） | Bignum |
| sint32 | 負の値があるときはこっちが効率的。 | Fixnum or Bignum (as required) |
| sint64 | 負の値があるときはこっちが効率的。 | Bignum |
| fixed32 | 4byte固定。 228を超える値の時unit32よりも効率的になることがある。 | Fixnum or Bignum (as required) |
| fixed64 | 8byte固定。 256を超える値の時unit64よりも効率的になることがある。 | Bignum |
| sfixed32 | 4byte固定。 | Fixnum or Bignum (as required) |
| sfixed64 | 8byte固定。 | Bignum |
| bool | 真偽値。 | TrueClass/FalseClass |
| string | UTF-8またはASCIIの文字情報。 | String (UTF-8) |
| bytes | 任意のバイトシーケンス。 | String (ASCII-8BIT) |


## C＃
| .proto | Notes | C＃ |
|:--|:--|:--| 
| double | 8byte小数。 | double |
| float | 4byte小数。 | float |
| int32 | 0以上の整数ならこっち。（符号付） | int |
| int64 | 0以上の整数ならこっち。（符号付） | long |
| uint32 | 0以上の整数ならこっち。（符号なし） | uint |
| uint64 | 0以上の整数ならこっち。（符号なし） | ulong |
| sint32 | 負の値があるときはこっちが効率的。 | int |
| sint64 | 負の値があるときはこっちが効率的。 | long |
| fixed32 | 4byte固定。 228を超える値の時unit32よりも効率的になることがある。 | uint |
| fixed64 | 8byte固定。 256を超える値の時unit64よりも効率的になることがある。 | ulong |
| sfixed32 | 4byte固定。 | int |
| sfixed64 | 8byte固定。 | long |
| bool | 真偽値。 | bool |
| string | UTF-8またはASCIIの文字情報。 | string |
| bytes | 任意のバイトシーケンス。 | ByteString |


## PHP

| .proto | Notes | PHP |
|:--|:--|:--| 
| double | 8byte小数。 | float |
| float | 4byte小数。 | float |
| int32 | 0以上の整数ならこっち。（符号付） | integer |
| int64 | 0以上の整数ならこっち。（符号付） | integer/string[5] |
| uint32 | 0以上の整数ならこっち。（符号なし） | integer|
| uint64 | 0以上の整数ならこっち。（符号なし） | integer/string[5] |
| sint32 | 負の値があるときはこっちが効率的。 | integer|
| sint64 | 負の値があるときはこっちが効率的。 | integer/string[5] |
| fixed32 | 4byte固定。 228を超える値の時unit32よりも効率的になることがある。 | integer |
| fixed64 | 8byte固定。 256を超える値の時unit64よりも効率的になることがある。 | integer/string[5] |
| sfixed32 | 4byte固定。 | integer |
| sfixed64 | 8byte固定。 | long |
| bool | 真偽値。 | boolean |
| string | UTF-8またはASCIIの文字情報。 | string |
| bytes | 任意のバイトシーケンス。 | string |

[5] Integer is used on 64-bit machines and string is used on 32-bit machines.