基本型
論理値型
論理値はbool型で表します。下記のように、真の場合はtrue、偽の場合はfalseの値をとる動作をします。また、型推論での定義もできます。
var a bool //変数aをbool型で定義
a = true //変数aにtrueを代入
a := true
数値型
数値型には整数型が用意されており、符合付き整数型と符合なし整数型の2つの型が用意されています。
符合付き整数型はint8
、int16
、int32
、int64
の型があり、数値がサイズを表しています。
符合なし整数型はuint8(byte)
、uint16
、uint32
、uint64
の型があり、同様に数値がサイズを表しています。符合付きと違う点として、uint8
はbyte
型という別名でも定義することができ、uint8と同じ動作をします。
また、64bit実装のGoではint
型はint64
と同じ動作をしますが、下記のように、同じ符合付き64bit整数を表す方の変数同士であっても、型が異なるというところから、暗黙的な型変換はコンパイルエラーが発生してしまいます。
a := int(10)
b := int64(5)
b = a //コンパイルエラー
fmt.Printf("%v\n", b)
このように、暗黙的に型変換をしようとしてしまうとコンパイルエラーが出てしまいます。しかし、下記のようにしっかり型を指定し、明示的に型変換を行えばコンパイルエラーは発生せずに実行することができます。
a := int(10)
b := int64(a)
fmt.Printf("%v\n", b)
この方法を使えば、型のサイズの最大値を超えた数値の処理が可能になります。
a := int8(128) //コンパイルエラー
fmt.Printf("%v\n", a)
a := 128
b := int8(a)
fmt.Printf("%v\n", b)
int8の最大値である127を超えた128での処理ができるようになりました。これは、明示的に行うことで、最大値127に1が加わったときの2進数表現上でオーバーフロー(桁あふれ)が起こり、ラップアラウンドさせられ、値が最小値に戻るようになるからです。なので、この場合出力される値はint8の最小値である-128になるということです。
アップアラウンドの対策として、mathパッケージをインポートし、利用することで、桁あふれを意識しながらコードを書いていくことができます。
浮動小数点型
浮動小数点型にはfloat32: 単精度浮動小数点
、float64: 倍精度浮動小数点
の2つの型が用意されています。ちなみに、float32はfloat64より精度が低く、メモリ使用効率の面を考慮しないのであれば、特別ない理由がない限り使用するメリットは少ないと思われます。
a := 1.0 //float64
b := float32(1.0) //float32
また、浮動小数点型にも、mathパッケージによって数値範囲を表す定数が用意されていますし、浮動小数点リテラルを使って型の異なった値をとる場合には明示的な型変換を行う必要があります。しかし、小数点部は切り捨てられます。
次に、演算が不能になる特殊な値に関してです。下記の演算による出力結果として、それぞれ+Int(正の無限大)、-Int(負の無限大)、NaN(非数)という意味を持ちます。
1.0 / 0.0 //+Int
-1.0 / 0.0 //-Int
0.0 / 0.0 //NaN
複素数型
aが実部、bが虚部、iは虚数単位として、a + biというリテラルで表現されており、complex64
とcomplex128
の2つの型が用意されています。それぞれ、complex64型の実部、虚部にはfloat32
が使われており、complex128型の実部、虚部にはfloat64
が使われています。
下記は、複素数リテラルを使用した代入方法です。ちなみに、+ 記号についてはあくまでリテラルの一部であって、演算子ではありません。また、complex関数を使い、実部、虚部それぞれの引数を取ることでそれぞれの値を返し、生成することもできます。
a := 1.0 + 2i
a := complex(1.0, 2)
このリテラルの、実部、虚部の値を取り出すための関数も用意されています。
a := 1.0 + 2i
real(a) //1.0
imag(a) //2
rune型
これは文字を表す型であり、シングルクォーテーションで囲まれた文字を、Unicodeコードポイントで表現し、出力します。また、バックスラッシュから始まるプリフィックスを付加することで、Unicode文字を表現できます。他にも、文字列表現のエスケープシーケンスも用意されています。別名int32と定義されており、同じ動作をします。
a := '例'
fmt.Printf("%v", a) //20363
a := '\U00101234'
fmt.Printf("%v", a) //1053236
文字列型
string型と定義されており、ダブルクォーテーションで囲まれた文字列リテラルが用意されています。
a := "例題"
fmt.Printf("%v", a) //例題
a := "\u65e5本\U00008a9e"
fmt.Printf("%v", a) //日本語
文字列リテラルにはもうひとつ、RAW文字列リテラルという形式があります。これは、バッククォーテーションを使い、複数行の文字列に対応したり、その文字に対して処理を行わないという性質があります。
a := '
例題
例題
例題
'
fmt.Printf("%v", a) //例題
例題
例題
最後に
今回はGoの基本型についてまとめました!基本型そのものの表面だけではなく、意味や仕組みについてある程度踏み込んで理解できたのではないでしょうか?
この調子でアウトプット続けますー!
参考文献
著者 松尾愛賀
翔泳社 スターティングGo言語