Goの入門を続けていきましょう。定番のHello Worldの表示ができたので、次は変数宣言を見ていきましょう。
変数宣言はどの言語も同じようなイメージです。Go言語も同じようなものなのですが、ちょっと見かけない宣言の仕方もあって、これがGoの特徴でもあるのかなというところがあります。
ではやっていきましょう。
変数宣言
Go言語は基本的に静的型付けのプログラミング言語なので、変数の宣言時に型名を指定する必要があります。
変数宣言の初期化は次のような形になります。
var [変数名] [型名] = [値]
変数を出力するコードを具体的に書いてみましょう。
文字列、整数、少数、真偽値を表示してみます。
package main
import "fmt"
func main() {
var s string = "Go programming"
var x int = 10
var y float64 = 2.71828
var t, f bool = true, false
fmt.Println(s)
fmt.Println(x)
fmt.Println(y)
fmt.Println(t, f)
}
変数をmain()関数の中で宣言して、Println()で出力するコードです。
変数をvarで宣言して、変数名を記述し、その後に型名を指定しています。順にstring(文字列型)、int(整数型)、float64(浮動小数点数型)、bool(ブーリアン型)を宣言して値をイコールで代入して初期化しています。最後のt, fのように変数をカンマで区切って値をそれぞれ代入することもできます。
実行すると次のように表示されます。
Go programming
10
2.71828
true false
上のコードではvarをそれぞれ宣言していますが、次のように丸括弧()で括って一度の宣言することもできます。
package main
import "fmt"
func main() {
var (
s string = "Go programming"
x int = 10
y float64 = 2.71828
t, f bool = true, false
)
fmt.Println(s, x, y, t, f)
}
出力をPrintln()でまとめています。それぞれの変数、型名、イコール、値の位置を揃えることがこの書き方でのGoのコードスタイルのようです。VScodeを使っていれば、保存時に自動整形してくれます。Go Playgroundであれば、「Format」をクリックすれば整形してくれます。
結果は次のようになります。(同じ結果です)
Go programming 10 2.71828 true false
ここまでは変数に値を入れて初期化しましたが、値を入れずに変数を宣言することもできます。
次のように値を入れずに宣言してみます。
package main
import "fmt"
func main() {
var (
s string
x int
y float64
t, f bool
)
fmt.Println(s, x, y, t, f)
}
実行すると次のようになります。
0 0 false false
最初の文字列は空白、数値は値が入っていないのでどちらも0、bool型はfalseになります。
省略宣言
ここまでは変数の宣言にvarを冒頭に記述しましたが、省略形式で変数を宣言(short declaration)することができます。
var count = 5
count := 5
この2つの変数宣言はどちらも同じ意味を表しています。varキーワードを使わずに変数名にコロン(:)とイコール(=)を繋げで値を代入して初期化することができるわけです。
最初のコードをこの省略形式で書き換えると次のようになります。
package main
import "fmt"
func main() {
ss := "Go programming"
sx := 10
sy := 2.71828
st, sf := true, false
fmt.Println(ss, sx, sy, st, sf)
}
実行結果も同様になります。
Go programming 10 2.71828 true false
この省略宣言を使う方が、Goでは一般的のようです。
変数宣言の注意点
varを使った変数宣言と、:=を使った省略宣言を見てきましたが、宣言の場所に気を付ける必要があります。
どちらも、上のコードではfuncの中で宣言していました。
varに関しては、次のように関数の外で宣言しても問題ありません。(結果の出力は同じなので省略します)
package main
import "fmt"
var (
s string = "Go programming"
x int = 10
y float64 = 2.71828
t, f bool = true, false
)
func main() {
fmt.Println(s, x, y, t, f)
}
関数の外に定義した変数を参照して出力することができます。
しかし、省略宣言の方は関数の外で宣言することはできません。
package main
import "fmt"
ss := "Go programming" // エラーになります。
func main() {
fmt.Println(ss)
}
// syntax error: non-declaration statement outside function body
この書き方ではエラーになるので注意しましょう。
ただし次のように、単にmain()の外に出すのではなく、別の関数の中で宣言して、その関数をmain()で呼び出すという使い方は可能です。
package main
import "fmt"
func example() {
ss := "Go programming"
fmt.Println(ss)
}
func main() {
example()
}
ここでは、example()関数を定義して、その中で省略宣言で変数を初期化しています。このexample()をmain()で呼び出して出力しています。
これを実行すると、「Go programming」と出力することができます。
Pythonコードで書いてみると・・・
ついでにPython でも変数宣言を書いてみましょう。
Pythonは動的型付けのプログラミング言語なので、特にvarを宣言したり型名を指定しなくても書けるので、Goのような注意点は無いですね。
次のようなコードが書けると思います。
s = "Python programming"
x = 10
def main():
y = 2.71828
t, f = True, False
print(s, x, y, t, f)
if __name__ == "__main__":
main()
実行結果は以下のとおり。
Python programming 10 2.71828 True False
ただ、Pythonでも型名を指定して書く方法もあります。コードを読む人が意味を取りやすいようにアノテーションを意識的に記述しておくという流れもあるようです。
最後に
Go言語の入門として、変数宣言を扱いました。
Goの変数宣言では、varキーワードと共に変数名を記述し、型名を指定して初期化します。
varキーワードを使わずに、コロンとイコール(:=)を使って省略形式で宣言する方法もあります。(short declaration)
Goではこのshort declarationでの宣言が一般的のようですが、関数の中でしか使えないことには注意が必要です。