【Go言語】基本型(数値・ブール・文字・文字列)と宣言方法|初心者向け解説

目次

基本型の種類

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と同じサイズ)
unit80 ~ 255
unit160 ~ 65,535
unit320 ~ 4,294,967,295
unit640 ~ 18,446,744,073,709,551,615

■サンプルソース

var a int = 10
var b uint = 20
var c int8 = -128
整数型の選択ルール

整数を表す型がいくつかありますが、以下のルールに従って選択してください。

  • 基本的な利用シーン
    • ほとんどのケースで int を使えば問題なし。
  • サイズを意識する場合
    • int32int64 を使用:データの範囲を超えないように注意が必要。
  • メモリ節約が必要な場合:
    • int8uint8 を使用:特に組み込みシステムで有効。
  • 符号が不要な場合:
    • uint 系を選択:負の値を扱わない場合に適します。

①-2 浮動小数点型

浮動小数点数を扱う型には float32float64 があります。

型名精度
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 型として扱います。
文字列とは異なり「’」(シングルクォート)で囲います。

型名説明
byte1バイトで表現される文字型。主にASCII文字(英数字など)に使用英数字(’A’, ‘B’ など)
rune4バイトで表現される文字型。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言語で変数を宣言した際に、明示的に初期化しなかった場合に自動的に設定されるデフォルト値のことです。

型名ゼロ値
int0
float640.0
boolfalse
string“” (空文字)
byte0
rune0
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 を使って明示的に宣言した方が分かりやすくなります。
    • := は型推論を行うため、わざわざゼロ値を設定したい場合には冗長です。
  • 型が指定されていないリテラルを変数に代入する場合:
    • 型が自動推論されると、意図しない型が使われることがあります。
    • 特に異なる型が混在している場合、明示的に型を指定することで、より安定した動作が確保されます。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次