Go言語 基礎講座 #2 変数・定数

f:id:shinta2000ttt:20200722180639p:plain

目次

変数への代入

var a int
a = 10
b := 20

fmt.Println("a =", a)   // a = 10
fmt.Println("b =", b)   // b = 20

2種類の代入方法があります。
1つ目は先に変数を定義してから値を代入する方法で、2つ目は定義と値の代入を同時にする方法です。1つ目は明示的にデータ型を指定するので、コンパイル時に型の不整合を検出できたり、保守性が高まるなどのメリットがあります。対して2つ目の方法はコードの記述量が減ったり、コードの変更に強いなどのメリットがあります。
どちらの方法を採るかは開発の方針に従ってください。

複数値の代入

var a, b, c int
a, b, c = 10, 20, 30

fmt.Printf("a=%d, c=%d, c=%d ¥n", a, b, c)  // a=10, b=20, c=30

このように複数の値の代入もできます。

代入法1の応用/インクリメント

var a, b int = 10, 20
a++
b--

fmt.Println("a =", a)  // a = 11
fmt.Println("b =", b)  // b = 19

代入1の方法の応用で、変数定義と同時に値も代入してしまうことが出来ます。変数の値のインクリメントはa += 1でも可能ですが、a++と書くことでより省略して書くことが出来ます。デクリメントも同様です。

定数の定義

const A = 100

fmt.Println("A =", A)  // A = 100

Goの定数は型指定をしなくても定義が可能です。

var a int64 = A

fmt.Println("a =", a)  // a = 100

なのでこのように変数に定数の値を代入しても型チェックのエラーにならなりません。

const B int64 = 200

fmt.Println("B =", B)  // B = 200

もちろん型を指定することもできます。

複数同時定義

const (
    A int = 10
    B
    C
)

fmt.Printf("A=%d, B=%d, C=%d", A, B, C)  // A=10, B=10, C=10

定数も複数を同時に定義することができます。その際、初めの定数だけに型指定・代入を行うと、以降すべての定数に同じ型と代入値が適用されます。

const (
    A int = 10
    B     = 11
    C     = 12
)

fmt.Printf("A=%d, B=%d, C=%d", A, B, C)  // A=10, B=11, C=12

ちなみにこのように定義すると、Aはint型ですがBとCは型指定されないのでuntypedになります。

自動インクリメント iota

const (
    zero = iota 
    one 
    two
)

fmt.Printf("zero=%d, one=%d, two=%d", zero, one, two)  // zero=0, one=1, two=2

Goには定数のためのiotaという記法があります。定数をまとめて定義する際に一番初めの定数にiota記法を使うと以降の定数に掛けて値がインクリメントされて代入されます。ちなみに最初の値は自動で0になります。

const (
    A = 10
    B = iota + 10
    C
)

fmt.Printf("A=%d, B=%d, C=%d", A, B, C)  // A=10, B=11, C=12

iotaの応用で、上記のようにiotaを定義の途中から使うと代入される値は0からではなく1からになります。これは間違えやすいので要注意です。

const (
    A = iota * iota
    B
    C
)

fmt.Printf("A=%d, B=%d, C=%d", A, B, C)  // A=0, B=1, C=4

iotaをこのように使うこともできます。