基本型の種類
Go言語には以下のデータ型があります。
- 数値型
- ブール型
- 文字・文字列型
これらの型を適切に理解することで、Go言語でのプログラミングがより理解しやすくなります。
早速、それぞれの基本型を見ていきましょう。
①数値型
数値型には整数型と浮動小数点型があります。
①-1 整数型
整数型は、符号付き(int)と符号なし(uint)に分かれます。
型名 | 値の範囲 |
---|---|
int | 一般的に 32 または 64 ビット (int64あるいはint32と同じサイズ) |
int8 | -128 ~ 127 |
int16 | -32,768 ~ 32,767 |
int32 | -2,147,483,648 ~ 2,147,483,647 |
int64 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
unit | 一般的に 32 または 64 ビット (unit64あるいはunit32と同じサイズ) |
unit8 | 0 ~ 255 |
unit16 | 0 ~ 65,535 |
unit32 | 0 ~ 4,294,967,295 |
unit64 | 0 ~ 18,446,744,073,709,551,615 |
■サンプルソース
var a int = 10
var b uint = 20
var c int8 = -128
整数を表す型がいくつかありますが、以下のルールに従って選択してください。
- 基本的な利用シーン:
- ほとんどのケースで
int
を使えば問題なし。
- ほとんどのケースで
- サイズを意識する場合:
-
int32
やint64
を使用:データの範囲を超えないように注意が必要。
-
- メモリ節約が必要な場合:
int8
やuint8
を使用:特に組み込みシステムで有効。
- 符号が不要な場合:
uint
系を選択:負の値を扱わない場合に適します。
①-2 浮動小数点型
浮動小数点数を扱う型には float32
と float64
があります。
型名 | 精度 |
---|---|
float32 | 約7桁 |
float64 | 約15桁 |
var x float32 = 3.14
var y float64 = 2.718281828
fmt.Println(x, y) // 3.14 2.718281828
浮動小数点数を表す型がいくつかありますが、以下のルールに従って選択してください。
- 基本的な利用シーン:
- ほとんどのケースで
float64
を使えば問題なし。
- ほとんどのケースで
- メモリ使用量を節約したい場合や、パフォーマンスが重要な場合:
-
float32
を使用:データの範囲を超えないように注意が必要。
-
そもそも浮動小数点数を使う必要があるかも要検討です。
浮動小数点数はあくまでも近似値でしかないので、以下の場合にのみ利用しましょう。
- 誤差があっても許容される場合
- 浮動小数点数の処理方法を理解している場合
演算子
数値型の値に対して使用できる基本的な演算子を紹介します。
演算子 | 説明 | 例 |
---|---|---|
+ | 加算 | a + b |
- | 減算 | a – b |
* | 乗算 | a * b |
/ | 除算 | a / b |
% | 剰余(余り) | a % b |
var a int = 10
var b int = 3
fmt.Println(a + b) // 13
fmt.Println(a - b) // 7
fmt.Println(a * b) // 30
fmt.Println(a / b) // 3 (整数同士の除算は整数になる)
fmt.Println(a % b) // 1 (10 ÷ 3 の余り)
また、基本的な計算以外にも代入演算子や比較演算子も利用できます。
代入演算子
代入演算子を使うことで、変数の値に演算を加えた結果をそのまま再代入することができます。
演算子 | 説明 | 例 |
---|---|---|
+= | 加算して代入 | a += b ( a = a + b と同じ) |
-= | 減算して代入 | a -= b ( a = a - b と同じ) |
*= | 乗算して代入 | a *= b ( a = a * b と同じ) |
/= | 除算して代入 | a /= b ( a = a / b と同じ) |
%= | 剰余を代入 | a %= b ( a = a % b と同じ) |
var a int = 10
var b int = 5
a += b // a = a + b (10 + 5)
fmt.Println(a) // 15
a -= b // a = a - b (15 - 5)
fmt.Println(a) // 10
a *= b // a = a * b (10 * 5)
fmt.Println(a) // 50
a /= b // a = a / b (50 / 5)
fmt.Println(a) // 10
a %= b // a = a % b (10 % 5)
fmt.Println(a) // 0
比較演算子
比較演算子を使うと、2つの値を比較し、その結果を true
または false
で返します。
演算子 | 説明 | 例 |
---|---|---|
== | 等しいかどうか | a == b |
!= | 等しくないかどうか | a != b |
> | より大きいかどうか | a > b |
< | より小さいかどうか | a < b |
>= | より大きいか、または等しいか | a >= b |
<= | より小さいか、または等しいか | a <= b |
var a int = 10
var b int = 5
fmt.Println(a == b) // false (a と b は等しくない)
fmt.Println(a != b) // true (a と b は等しくない)
fmt.Println(a > b) // true (a は b より大きい)
fmt.Println(a < b) // false (a は b より小さくない)
fmt.Println(a >= b) // true (a は b と同じか大きい)
fmt.Println(a <= b) // false (a は b より小さくない)
浮動小数点型の比較時の注意点
浮動小数点数の比較を行う場合、誤差を考慮して比較する方法を取るのが一般的です。
例えば、以下のように許容誤差(epsilon
)を使って比較します。
var a float64 = 0.1 + 0.2
var b float64 = 0.3
epsilon := 0.0000001
fmt.Println(math.Abs(a-b) < epsilon) // true (a と b は誤差の範囲内で等しいとみなせる)
math.Abs
関数は2つの浮動小数点数の差の絶対値を計算し、その差が許容誤差より小さいかをチェックします。
この方法で、浮動小数点型の精度誤差による問題を回避できます。
②ブール型
ブール型は true
または false
の値を取ります。
var flag bool = true
fmt.Println(flag) // true
③文字・文字列型
Go言語では、文字や文字列を扱うための型として 文字型(rune
, byte
)と 文字列型(string
)があります。
- 文字型は単一の文字を扱うために使用し、主に
byte
(1バイトの文字)とrune
(4バイトのUnicode文字)を使用します。 - 文字列型は複数の文字を含むテキストを扱うために使用し、
string
型として格納されます。
③-1 文字型
Go言語では、文字を rune
または byte
型として扱います。
文字列とは異なり「’」(シングルクォート)で囲います。
型名 | 説明 | 例 |
---|---|---|
byte | 1バイトで表現される文字型。主にASCII文字(英数字など)に使用 | 英数字(’A’, ‘B’ など) |
rune | 4バイトで表現される文字型。Unicode文字に使用 | 日本語(’さ’, ‘あ’ など) |
var charRune rune = 'A' // Unicode の文字 'A' を表す
var charByte byte = 'B' // ASCII 文字 'B' を表す
fmt.Println(charRune, charByte) // 65 66
③-2 文字列型
文字列型は string
型で表します。
Go言語における文字列は UTF-8 エンコーディングとして内部的に保存されます。これにより、文字列は多国語に対応できる強力な型です。
文字型とは異なり、「”」(ダブルクォート)で囲います。
型名 | 説明 | 例 |
---|---|---|
string | 文字列を表現する型で、UTF-8エンコーディングを使用 | “Hello” |
var str string = "Hello, Go!"
fmt.Println(str) // Hello, Go!
文字列の長さ
文字列の長さを求めるにはlen()
関数を使いますが、これは文字列のバイト数を返します。
var str string = "Go言語"
fmt.Println(len(str)) // 12 (バイト数で返す。日本語などは2バイト以上の場合がある)
len(str)
は文字列のバイト数を返します。日本語などのマルチバイト文字の場合、1文字あたりのバイト数が異なるため、バイト数が予想以上に大きくなることがあります。
文字列の取り出し(インデックス)
文字列の中の個々の文字(バイト)をインデックスを使って取り出すこともできます。インデックスは 0 から始まりますが、取り出されるのは バイト単位 です。
var str string = "Go言語"
fmt.Println(str[0]) // 71 (文字 'G' のASCIIコード)
fmt.Println(str[1]) // 111 ('o' のASCIIコード)
- 上記の例では、
str[0]
は最初の文字 ‘G’ の ASCII コード(71)を返します。 - ただし、日本語のようなマルチバイト文字を取り出す際は、
rune
型を使って取り扱う方が便利です。
rune
型で取り扱うvar str string = "Go言語"
for _, char := range str {
fmt.Println(char) // 文字ごとの Unicode コードポイント
}
range
を使うと、文字列をrune
型として扱い、Unicode コードポイントごとに分解できます。これにより、マルチバイト文字(日本語など)も正しく取り出せます。
ゼロ値
ゼロ値とは、Go言語で変数を宣言した際に、明示的に初期化しなかった場合に自動的に設定されるデフォルト値のことです。
型名 | ゼロ値 |
---|---|
int | 0 |
float64 | 0.0 |
bool | false |
string | “” (空文字) |
byte | 0 |
rune | 0 |
var a int // int型
var b float64 // float64型
var c bool // bool型
var d string // string型
var e byte // byte型(uint8のエイリアス)
var f rune // rune型(int32のエイリアス)
変数の宣言方法
Go言語では変数を宣言する方法がいくつか用意されているので、正しい宣言方法について解説していきます。
var
を使った宣言方法- 型推論
①var
を使った宣言方法
もっとも詳細な宣言方法はvar
を使うもので、次のように型と初期値を指定します。
var x int = 10
型指定の省略
var
を使った変数宣言では、型を省略することも可能です。この場合、右辺の値に基づいて型が推論されます。以下のように、型を指定せずに宣言できます。
var x = 10
多重代入
複数の変数を一度に宣言して初期化することもできます。
これを「多重代入」といいます。複数の変数を一度に初期化することで、コードが簡潔になります。
var x, y, z int = 10, 20, 30
宣言リスト
複数の変数を同時に宣言する「宣言リスト」を使うこともできます。
これを使うと、変数をまとめて宣言し、コードを整理することができます。
var (
x int = 10
y string = "Go言語"
z float64 = 3.14
)
②型推論
Go言語では短い形式での宣言方法もサポートされています。
関数内ではvar
による宣言の代わりに:=
を使うと、型を省略して宣言できます。
x := 10
var
と:=
の違い
:=
では、var
にはできないことができます。
それは、「既存の変数に値を代入できる」ということです。
:=
の左辺に新しい変数が一つあれば、他の変数は既存のものも使えます。
x := 10
x, y := 30, "hello"
また、:=
には制限もあります。
それは、「パッケージレベルで変数を宣言できない」ということです。
つまり、:=
は関数の外では使えないので、その場合はvar
を使用する必要があります。
型宣言の使い分け
関数内で最もよく使われるのは:=
で、関数の外ではvar
を利用します。
ただし、以下のケースでは関数内でも:=
を避けるべきです。
:=
を避けるべきケース- ゼロ値に初期化する場合:
- ゼロ値の変数を宣言したい場合、
:=
ではなく、var
を使って明示的に宣言した方が分かりやすくなります。 :=
は型推論を行うため、わざわざゼロ値を設定したい場合には冗長です。
- ゼロ値の変数を宣言したい場合、
- 型が指定されていないリテラルを変数に代入する場合:
- 型が自動推論されると、意図しない型が使われることがあります。
- 特に異なる型が混在している場合、明示的に型を指定することで、より安定した動作が確保されます。
コメント