Go言語の変数宣言は扱いましたが、ここでは定数の宣言を扱います。
他の言語と同様、値が変化しないものが定数なので、内容としては特に問題ないものだと思います。
では、Goでの定数の宣言を見ていきましょう。
定数の宣言 – const
変数の宣言では、varキーワードを使いましたが、定数の宣言にはconstキーワードを使います。
constは関数の中でも使えますが、globalな位置で宣言するのが一般的です。
次のように書くことができます。
package main
import (
"fmt"
)
const i int = 100
const s string = "constants"
const e = 2.71828
func main() {
fmt.Println(i)
fmt.Println(s)
fmt.Println(e)
fmt.Printf("%T\n", i)
fmt.Printf("%T\n", s)
fmt.Printf("%T\n", e)
}
関数の外で宣言しています。最初の2つは、constキーワードの後に定数名を入れて、型を指定したものに値を代入していますが、3つ目は型を宣言していません。このようにconstは変数の省略宣言のような形ではなく、イコールで値を定義して構いません。
実行結果はこうなります。
100
constants
2.71828
int
string
float64
順に、それぞれの値と型を出力しています。
このコードは次のように定数をまとめて書くことができます。
package main
import (
"fmt"
)
const (
i = 100
s = "constants"
e = 2.71828
)
func main() {
fmt.Println(i)
fmt.Println(s)
fmt.Println(e)
fmt.Printf("%T\n", i)
fmt.Printf("%T\n", s)
fmt.Printf("%T\n", e)
}
constの各定数を丸括弧()で囲んでまとめて書いているのがわかります。実行結果は先ほどと同じになります。
constは定数なので、次のように途中で値を変更することはできません。
package main
import (
"fmt"
)
const e = 2.71828
func main() {
e = 3.14
fmt.Println(e)
}
// cannot assign to e
定数eの値を関数内で書き換えていますが、当然エラーになります。
定数の大文字
constキーワードに続く定数名は、上のコードでは全て小文字で書きました。
これを大文字で書くとどうなるか?
package main
import (
"fmt"
)
const (
Napier = 2.71828
)
func main() {
fmt.Println(Napier)
}
このように書いても問題無いですが、エディターの機能から何らかの注意喚起のメッセージが出ることもあると思います。
このように大文字で定数を始める場合は、他のGoのファイルから呼び出すことができるパッケージとして使う時の書き方になります。
このあたりの違いも区別しておきましょう。
Pythonコードで書いてみると…
Pythonでの定数はどうだったか?
Pythonにはconstのような定数を宣言するキーワードはありません。
Python では定数を定義するときは、定数として扱う変数を定数名としてすべて大文字(単語をつなげる場合はアンダースコア)で構成するのが標準的な書き方として慣例となっています。
NAPIERS_CONSTANT = 2.71828
def main():
print(type(NAPIERS_CONSTANT), NAPIERS_CONSTANT)
if __name__ == "__main__":
main()
実行結果は以下のとおり。
<class 'float'> 2.71828
Pythonの場合は変数を大文字で書いて定数として扱っているだけなので、値を変更することができてしまうので、そのあたりは注意が必要です。
GoとPythonの違いでもありますね。
最後に
Go言語の定数宣言についてみてきました。
定数はconstキーワードに続けて定数名を書き、型名を指定して、イコールで値を代入します。型名は省略することもできます。
定数を大文字で書き始める場合は、パッケージとして他のGoファイルから利用できるということを前提とした書き方になります。