基本文法一覧

【Go入門】変数と定数

こんにちは。Go入門ブログの第4回です。

本記事では、Goにおける変数と定数の扱い方を解説します。
なお、変数の宣言に型を指定していますが、Goの基本型については以下の記事で詳しく解説しています。

【Go入門】基本型と数値型変換(キャスト)・文字列リテラル

varステートメントによる変数宣言

変数の宣言にはvarステートメントを使用します。
さっそく例をみてみましょう。

基本的な変数宣言
var b bool  // bool型の変数bを宣言
var i int  // int型の変数iを宣言
var s string  // string型の変数sを宣言

上記がもっとも基本的な変数の宣言形式です。
varステートメントの後に変数名と型を記述します。

複数の変数の宣言

次に、複数の変数をまとめて宣言する記述方法を見てみましょう。

変数をカンマ区切りで記述し、最後に型を書くことで、変数のリストを宣言できます。
また、importと同様に変数を括弧で括ることでも、複数の変数宣言をまとめて記述することができます。

// 複数の変数をカンマ区切りで宣言できる
var x int, y int
var x, y int

// 括弧でくくることで複数の変数をまとめて宣言できる
var (
  x int
  y int
  s string
)
初期化子(型の宣言の省略)

また、変数の宣言時に初期化子を与えることもできます。
初期化子を与える場合、型の宣言を省略することができます。
この場合、変数の型は初期化子が持つ型になります。

// 初期化子を指定することで型の宣言を省略できる
var x, y = 1, 2

なお、初期化子を指定しない場合は、変数の型に応じて以下の初期値が与えられます。
このような初期値をゼロ値と言います。

数値型の場合: 0
論理型の場合: false
文字列型の場合: “” (空文字列)

:=(コロンイコール)による変数宣言

関数の中でのみ、varステートメントを使用せず、:=(コロンイコール)の代入文を使用して暗黙的な型宣言ができます。

関数の外では、importやfuncなどキーワードではじまる宣言が必要です。
変数も同様にvarでの宣言が必要となるため、:=での暗黙的な宣言は行えません。

以下の例を見てみましょう。

package main

import "fmt"

func main() {
	// :=(コロンイコール)による変数宣言
	x := 1
	// カンマ区切りで複数の変数を宣言できる
	y, s := 2, "1 + 2 ="
	fmt.Println(s, x+y)
}

:=による変数宣言は、varステートメントで初期化子を指定する場合と同じですが、より短く記述することができ、可読性は高まります。

ただし、関数の先頭で変数をまとめて宣言する場合などは、varステートメントを使用し括弧でくくった方が、変数宣言部であることがわかりやすいこともあります。
状況に応じて使い分けてるとよいでしょう。

未使用の変数宣言に対するコンパイル時チェック

Goは、使用しない変数の宣言を許可しません。
宣言されながら未使用の変数がある場合、コンパイル時にエラーが発生します。

package main

import "fmt"

func main() {
	// :=(コロンイコール)による変数宣言
	x := 1
	// カンマ区切りで複数の変数を宣言できる
	y, s := 2, "1 + 2 ="
	fmt.Println(s, x)
}

上記のコードでは、変数yが宣言されていながら使用されていません。
このファイルをビルドした場合、以下のコンパイルエラーが発生します。

main.go:9:2: y declared and not used

定数

定数は、constキーワードを使って変数と同じように宣言することができます。

// 定数の宣言
const Bool = true
const Int = 1
const Str = "string"

// カンマ区切りで複数の定数を宣言できる
const X,Y = 1,2

なお、定数は := を使って宣言できません。
必ずconstによる宣言が必要になります。

変数と定数のスコープ

変数や定数を宣言する位置により、その変数および定数を使用できる範囲が異なります。

グローバル変数・定数
関数の外で宣言した変数や定数は、同じファイル内のどこからでもアクセスできます。

ローカル変数・定数
関数内で宣言した変数は、その関数内でしか使用できません。

以下のサンプルをご覧ください。

package main

import (
	"fmt"
)

// 関数外で宣言した変数と定数は、同じファイル内のどこからでもアクセスできる
var (
	global1 = 1
	global2 = 10
)
const GlobalConst = "1 + 100 ="

func main() {
	// 関数内で宣言した変数や定数はその関数内でしか使用できない
	local1, local2 := 100, 1000
	const LocalConst = "10 * 1000 ="

	fmt.Println(GlobalConst, global1+local1)
	fmt.Println(LocalConst, global2*local2)
}

こちらのサンプルを実行すると以下のような出力結果になります。

$ go run main.go
1 + 100 = 101
10 * 1000 = 10000

終わりに

今回は、Goにおける変数の扱いについて解説しました。
変数に様々な宣言方法があることや、未使用の変数宣言を許可しないこと、宣言する位置の使い分けなどがお分かりいただけたと思います。
次回記事では、変数宣言と関わりの深い型についての解説を行いますのであわせてご覧ください。


スポンサーリンク
スポンサーリンク
スポンサーリンク