Goの型は次の4種類に分けられる。
- 基本型
- 集成型
- 参照型
- インターフェース型
この章では基本型を扱う。基本型は数、文字列、ブール型である。 集成型は配列や構造体のような、よりシンプルな型の値の組み合わせからなる型である。 参照型はポインタ、スライス、マップ、関数、チャネルを扱う。 これらの型の値は共通してプログラム内の変数や状態を間接的に参照する。 そのため一つの参照への作用は、その参照のすべてのコピーに対して反映される。 インターフェース型については7章で扱うこととする。
Goの数値型はさまざまな大きさの整数、浮動小数点数、複素数を含んでいる。 それぞれの型により、そのサイズと符号なしかどうかが決まる。 Goは符号付と符号なしの両方の数を扱うことが出来る。
- signed
- int8
- int16
- int32
- int64
- unsinged
- uint8
- uint16
- uint32
- uint64
int, uintはプラットフォームごとに適したサイズを持つ整数型。 int, uintは同じ環境では同じサイズで32bitか64bitのいずれかである。
rune型はint32のシノニムでUnicodeのコードポイントを表すのに使われる。 byte型は同様にuint8のシノニムである。
uintptr型は主にポインタのビット列を保持するために使われる。 主な用途としては、GoプログラムとCのライブラリ、もしくはGoプログラムとOSの境界域のようなロウレベルのプログラミングで使われる。 unsafeパッケージを用いた例を13章で扱う。
符号付の数は2の補数を用いても表すことが出来る。 最上位ビットは符号として使われ、値の範囲は-2^(n-1)~2^(n-1)-1となる。 符号なしの場合は値の範囲は0~2^n-1となる。
Goの算術演算子、論理演算子、比較演算子は以下の順で優先づけられる。
*
,/
,%
,<<
,>>
,&
,&^
+
,-
,|
,^
,==
,!=
,<
,<=
,>
,>=
&&
||
同じ順位の演算子であれば、コードの左から順に関連付けられるので、優先順位を明確にするには丸括弧を使う。
上記リストの最初の2行の演算子は+=
のような対応する代入演算子を持つ。
整数の算術演算子+
,-
,*
,/
は整数、浮動小数、複素数に適用できる。
%
は整数にのみ適用できる。
Goでは-5 % -3
と-5 % 3
はどちらも-2
となる。
/
を整数に適用した場合は、余りは切り捨てられる。
算術演算の結果、型の最大値より多くのビットが結果となることがある(overflow)。 あふれた上位のビットは切り捨てられる。 符号付であれば最上位ビットが1になった場合、値は負になる。
二つの同じ型の整数はバイナリ比較演算子で比較することが出来る。 比較結果の方はブール型である。
1.==
2.!=
3.<
4.<=
5.>
6.>=
すべての基本型は同じ型の値同士で==
と!=
を用いて比較可能である。
加えて整数、浮動小数、文字列は比較演算子で順序付けることが出来る。
他の型については、多くの型は比較可能ではないし、順序付けできる型はない。
それぞれの型については比較可能かどうかを決めるルールを作ることが出来る。
+
と-
の符号は正負を決めるために使うことが出来る。
整数では+x
は0 + x
と同じであり、-x
は0 - x
である。
浮動小数と複素数では+x
はそのままx
として、-x
はx
の否定としてあらわされる。
Goはまたビット演算子を提供する。
&
,|
,^
,&^
,<<
,>>
^
は排他的論理和の二項演算子として扱われるが、単項演算子として前置されるときは、ビット反転の演算子となる。
&^
は二つのビット列について右項の対応するビットが1ならば0に、
右項が0ならば左項の対応するビットと同じビットに、結果のビット列の対応するビットをセットする。
>>
と<<
はビットシフトである。右項は符号無しでなければならない。
左シフトはゼロ埋めを行う。右シフトも同様だが符号付きの場合は最上位ビットは変わらない。
符号無し整数で十分に見えるケースでも、符号付きの整数を使うべき例としては、
forループで、インデックスを減算していくような場合が挙げられる。
符号無し整数uintを0
をデクリメントすると2^64 -1
に等しい値になる。
符号無し整数は、ビット列を実装したりバイナリファイルをパースしたり、暗号的にハッシュ化したりする際などに使うべきである。
通常、値の型を変換する際は、明示的な型変換が要求される。 二項演算子は両方のオペランドが同じ方でなければならない。 変換するには幾つかのやり方があるが、一番直接的なのは、オペランドの値を全て基本型に変換してしまうことである。
2.5で述べたようにT(x)
は値x
をT
型に変換する。
大きな整数を小さな整数に変換したり、整数を浮動小数に変換したりする場合、値が失われたり精度が下がることに注意する必要がある。
浮動小数から整数への変換は小数部の切り捨てが起きる。 また変換結果が実装依存になるため、オーバーフローするような変換は避けるべきである。
整数型のリテラルとして10進数に加えて、8進数、16進数の記法をとることができる。
##3.2. 浮動小数型 Goの浮動小数型は二つある。float32とfloat64である。これらの詳細はIEEE754で標準化されており、モダンなCPUでサポートされている。
mathパッケージでは浮動小数の限界値を提供している。
- math.MaxFloat32
- math.MaxFloat64
float32はサイズが小さく扱いに注意が必要なため、 多くのケースではfloat64を使うことが望ましい。
浮動小数は10進数で表記される。2.71727
またe
もしくはE
を用いて指数表記を使ってもよい。
mathパッケージはIEEE754で定義されている特別な値を作ったり判別したりすることができる。それらは正の無限大と負の無限大、ゼロ除算の結果としてのNaN
である。
math.IsNaN
は引数が非数であるかをチェックする。
math.NaN
は値としてNaN
を返す。
NaN
との比較は常にfalseを返す。
ここから浮動小数を使ったグラフのコード例
Goは二つのサイズの複素数型を提供している。complex64
とcomplex128
である。
10進数もしくは浮動小数のリテラルの後ろにi
がくっついているとき、それは虚数となる(実部はゼロとなる)。
定数表現であれば複素数の定数は他の定数(整数もしくは浮動小数の実部もしくは虚部)に足しこむことができる。
1+2i
,2i+1
。
これにより複素数を自然に表記することができる。
複素数は==
と!=
で比較することができ、実部と虚部がそれぞれ同じであれば同一と判定される。
マンデルブロ図の説明
ブール型bool
は二つの値を持つ(true
, false
)。
if
,for
ステートメントの条件式はブール値もしくはブール値を返す比較演算子式である必要がある。
単項演算子!
は論理否定である。
ブール値は&&
(論理積)もしくは||
(論理和)で結合することができる。左項が式の結果を決める場合、右項は評価されないので、以下のような表現を安全に書くことができる。
s != "" && s[0] == 'x'
s[0]
が空文字の場合panic
となる(が上の式では起きない)。
&&
は||
より優先順位が高いので、以下のようなコードでは丸括弧は不要である。
if 'a' <= c && c <= 'z' ||
'A' <= c && c <= 'Z') {
...
}
ブール値を数値に暗黙に変換する方法はない。 if文を用いる必要がある。
b := true
i := 0
if b {
i = 1
}
すみません、ここで力尽きました。。。