前回の投稿に引き続きGo言語の入門をしていきます。
今回は、変数宣言についてまとめます。
前回、Go言語でHello worldした記事はこちら。
https://nori-life-log.com/【go言語】hello-worldしてみた
変数宣言
まずは一番オーソドックスな変数宣言です。
package main
import "fmt"
func main() {
var i int = 1
var f64 float64 = 1.2
var s string = "test"
var t bool = true
var f bool = false
fmt.Println(i, f64, s, t, f)
}
実行すると、
1 1.2 test true false
という結果が出力されます。
基本は、
var name type = value
という形式で、nameに変数名、typeに変数の型、valueに値が入ります。
変数宣言は、短縮して書くことができます。
func main() {
var (
i int = 1
f64 float64 = 1.2
s string = "test"
t, f bool = true, false
)
fmt.Println(i, f64, s, t, f)
}
先ほどはすべての宣言に「var」を書いていましたが、「var()」とすることで、カッコ内に宣言をまとめて記述することができます。
また、同じ型の変数は一度に宣言することができるので、bool型の変数「t」と「f」はカンマ区切りで同時に宣言することができます。
型推論
Go言語では、型を指定せずに変数を宣言することができます。
いわゆる、型推論というやつですね。例を示します。
func main() {
i := 1
f64 := 1.2
s := "test"
t, f := true, false
fmt.Printf("%T, %T, %T, %T, %T\n", i, f64, s, t, f)
fmt.Println(i, f64, s, t, f)
}
出力結果は、
int, float64, string, bool, bool 1 1.2 test true false
となります。
fmt.Printf("%T", hogehoge)
で、変数hogehogeの型名を出力してくれます。
「:=」での宣言はShort variable declarationsと呼び、shortやshort varといった略し方をするようです。
この「:=」ですが、関数の外では使用できません。
逆に、型を指定すれば関数の外で変数の宣言ができます。(グローバル変数)
また、一度宣言した変数名を再度宣言しようとするとエラーになります。
package main
import "fmt"
var i int = 1
// s := "test" エラーになる
func main() {
var i int = 1
f64 := 1.2
// f64 := 1.3 エラーになる
fmt.Println(i, f64)
}
※グローバル変数の「i」とmain関数内の「i」はスコープが異なるためエラーになりません。
const
const宣言した変数は書き換えられない値となります。
package main
import "fmt"
const Pi = 3.14
func main() {
// Pi = 3 エラーになる
fmt.Println(Pi)
}
出力結果は、
3.14
となります。
const宣言した「Pi」は不変の値となるので、
Pi = 3
という命令はエラーとなります。
ちなみに、const宣言した変数が評価されるのは、命令が実行されるときです。
例えば、以下のようなコードの場合、
package main
import (
"fmt"
"math"
)
const (
Pi = 3.14
MaxInt = math.MaxInt64 + 1
)
// var MaxInt64 int = math.MaxInt64 + 1 エラーになる
func main() {
fmt.Println(Pi)
fmt.Println(MaxInt - 1)
}
const宣言したMaxIntはGo言語が表現できる最大整数を1超えた値となっていますが、
評価される際には
fmt.Pringln(MaxInt - 1)
と-1されることでエラーになることなく出力されます。
逆に、const宣言せず、普通に
var MaxInt64 int = math.MaxInt64 + 1
とすると、宣言時に評価されるため、intの範囲を超えエラーになってしまいます。
まとめ
Go言語の変数宣言についてまとめました。
PythonとC#を主に使っていた私としては両言語を足して2で割ったような言語仕様だなぁと感じております。
次回もGo言語についてまとめていきます。
以上!
コメント