
Go言語での変数宣言の方法が知りたいな…
プログラミング言語を学習する上で、”Hello World”の出力の次に学習するのが「変数」でしょう。
Go言語は静的型付け言語で、「型」には厳格なプログラミング言語です。
Pythonなどを学習してきた方であれば、若干の違いがあります。
Go言語の変数宣言を理解できるようにしましょう。
型については、当ブログ記事を参考にしてください。
Go言語での標準的な変数宣言の形式(varを使用)
Go言語で変数宣言する一般的な形式は…
となっています。

それでは、実際にコードで説明していきますね。
// 一般的変数定義
package main
import "fmt"
func main(){
// var 変数名 型 = 値
// 整数型int
var i int = 1
fmt.Println(i)
}
// 出力結果
$ go run main.go
1

それでは、もうひとつ文字列を代入できる変数宣言をしましょう。
// 一般的な変数定義
package main
import "fmt"
func main(){
// var 変数名 型 = 値
// 文字列型string
var s string = "Hello World"
fmt.Println(s)
}
// 出力結果
$ go run main.go
Hello World
この他にも、小数(実数)を格納できる型の float32
と float64
(こっちが一般的)と、真偽値を格納できる bool
などがあります。
// 一般的な変数定義
package main
import "fmt"
func main(){
// var 変数名 型 = 値
var i int = 1
var fl64 float64 = 2.3
var s string = "Hello World"
var t bool = true
var f bool = false
fmt.Println(i, fl64, s, t, f)
}
// 出力結果
$ go run main.go
1 2.3 Hello World true false
複数の同じ型の変数を宣言する場合
同じ型で複数の変数を宣言する時、省略して記述することもできます。
// 複数の同じ型の変数を宣言する
package main
import "fmt"
func main(){
// var 変数名1, 変数名2, ... 型 = 値1, 値2, ...
var t, f bool = true, false
fmt.Println(t, f)
}
// 出力結果
$ go run main.go
true false
型の違う変数をまとめて宣言する
Go言語では、型の違う変数を一度に宣言することができます。
この方法で宣言すると var
の記述を一回だけに省略できます。
// 型の違う変数をまとめて宣言
package main
import "fmt"
func main(){
var (
i int = 1
fl64 float64 = 2.3
s string = "Hello World"
t bool = true
f bool = false
)
fmt.Println(i, fl64, s, t, f)
}
// 出力結果
$ go run main.go
1 2.3 Hello World true false
変数宣言時に初期化しない場合(宣言時に値を代入しない時)
あらかじめ変数宣言をしておき、あとから値を代入することもできます。
// 変数宣言時に初期化しない場合
package main
import "fmt"
func main(){
var (
i int
fl64 float64
s string
t bool
f bool
)
fmt.Println(i, fl64, s, t, f)
}
出力結果には、それぞれの型の初期値が代入されています。
// 出力結果
$ go run main.go
0 0 false false

string型の初期値は空文字なので、出力結果では見えていません。
値を代入する(初期化していない変数の場合)
初期化していない変数に値を代入してみましょう。
// 初期化していない変数の値の代入
package main
import "fmt"
func main(){
var (
i int
fl64 float64
s string
t bool
f bool
)
fmt.Println(i, fl64, s, t, f)
i = 10
fl64 = 1.23
s = "Hello Golang"
t = true
f = false
fmt.Println(i, fl64, s, t, f)
}
// 出力結果
$ go run main.go
0 0 false false
10 1.23 Hello Golang true false
値の再代入
変数は値を再代入することができます。
// 値の再代入
package main
import "fmt"
func main(){
// var 変数名 型 = 値
// 整数型int
var i int = 1
fmt.Println(i)
i = 10
fmt.Println(i)
}
// 出力結果
$ go run main.go
1
10
Go言語での変数宣言の注意点
Go言語での変数宣言で注意しなけらばいけないことが2点あります。
1.変数の再定義はできません
コード内ので使用している変数を再定義することはできません。
// 変数の再定義はできません
import "fmt"
func main() {
var i int = 1
fmt.Println(i)
// 再定義してみる
var i string = "Hello Golang"
fmt.Println(i)
}
// 出力結果
$ go run main.go
# command-line-arguments
./main.go:9:6: i redeclared in this block
previous declaration at ./main.go:6:6
「goファイル中で”変数i”が重複して用いられている」というエラーになります。
2.変数に違う型の値を代入することができない
Go言語は静的型付け言語で型には厳格です。
// 変数に違う型の値を代入することができない
import "fmt"
func main() {
var i int = 1
fmt.Println(i)
// int型の変数に文字列の値を代入してみる
i = "Hello Golang"
fmt.Println(i)
}
// 出力結果
$ go run main.go
# command-line-arguments
./main.go:9:4: cannot use "Hello Golang" (type untyped string) as type int in assignment
「int型にはstring型の値は代入できない」というエラーになります。
宣言した変数は必ず使用しないといけない
無駄な変数宣言はしないことです。

無駄な変数がなくなるため、プログラムがスッキリしますね。
Go言語でのvarを使用しない変数宣言(型指定の省略)
Go言語では型指定を省略して変数宣言することができます。
型を省略していますが、代入した値によって型が決定されます。
// 変数の省略宣言(型指定の省略)
package main
import "fmt"
func main() {
xi := 1
xfl := 2.3
xs := "Hello Morip"
xt, xf := true, false
fmt.Println(xi, xfl, xs, xt, xf)
}
// 出力結果
$ go run main.go
1 2.3 Hello Morip true false

変数宣言のvarを省略した形は楽なんですが落とし穴もあります。
【参考】変数の型を確認しよう
型が省略されて変数宣言をすると、自分は理解できていても他の人がコードを見た時に型を確認しづらい点がありまので注意が必要です。
ちょうどよい流れなので、Go言語で変数の型を確認する方法をご紹介いたします。
いままでは Println()
関数を使用して出力してきましたが、変数の書式指定して値を出力する場合は Printf()
関数を使用します。
ここで注意しなければいけないのが Println()
関数は改行付きで出力されますが、Printf()
関数は改行は付きません。
ですから、改行したい時は \n
を付け加える必要があります。
// 変数の型を調べる
package main
import "fmt"
func main() {
xi := 1
xfl := 2.3
xs := "Hello Morip"
xt, xf := true, false
fmt.Println(xi, xfl, xs, xt, xf)
fmt.Printf("%T\n", xi)
fmt.Printf("%T\n", xfl)
fmt.Printf("%T\n", xs)
fmt.Printf("%T\n", xt)
fmt.Printf("%T\n", xf)
}
// 出力結果
$ go run main.go
1 2.3 Hello Morip true false
int
float64
string
bool
bool
ここで注意が必要なのがfloat型です。
float型には float32
と float64
があり、省略形で変数宣言した場合は float64
が選択されます。
Go言語でvarを使用しない変数宣言での注意点
変数をvarを省略した形で宣言した場合は、関数内でのみ使用でき関数外では使用できません。
// 変数の型を調べる
package main
import "fmt"
// 省略形の変数宣言を関数外で宣言
xi := 1
func main() {
fmt.Println(xi)
fmt.Printf("%T\n", xi)
}
// 出力結果
$ go run main.go
# command-line-arguments
./main.go:7:1: syntax error: non-declaration statement outside function body
シンタックスエラーになり「関数の外では宣言できません」というエラーになります。
ちなみに、通常の変数宣言だと…
// 変数の型を調べる
package main
import "fmt"
// 関数外で変数宣言
var i int = 1
func main() {
fmt.Println(i)
fmt.Printf("%T\n", i)
}
// 出力結果
$ go run main.go
1
int
エラーが出されずに値が出力されます。
通常の変数宣言とvarを省略した宣言の使い分け
通常の変数宣言とvarを省略した形の変数宣言の使い分けですが「あなたの好みで使用しても構わない」というのが結論なのですが、私の場合の使い分けですと…
基本的には通常の変数宣言を使用しています。
ただし、いろんなサイトやGo言語教材ではfor文のカウンタ変数には、varを省略した形を用いていることが多いです。

私もコードを簡潔したい制御構文では、varを省略した形を使用します。
【まとめ】Go言語の変数宣言を理解しよう

それでは、今回の記事内容をまとめてみましょう!
Go言語は静的型付け言語で、型指定をきちんと行うことでバグを極力おさえる設計になっています。
いま人気のPythonは動的型付け言語で、Pythonを学習してきた方にはとっつきにくい点もあったでしょうけど型指定をクリアできれば、それほど難しくなかったのではないでしょうか。
今回はGo言語の変数宣言についてまとめました。
Go言語の魅力を少しづつ理解していただければうれしいです!
comment