switch文

条件分岐には if 文のほかにもうひとつ、switch 文がある。switch 文は次の通り。

条件式の値と case 節の式A、B、C の値が順に比較され、等しくなる最初の case 節の処理が実行される。どの case 節の式とも等しくなければ default 節が実行される。
試してみよう。お題は FizzBuzz 問題だ。

^o^ > go run switch.go
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz

例題のために冗長な書き方にしたけど、期待通り動いている。見ればわかるように、case 節の式はひとつでなくてもいい。
また、条件式を書かない書き方もある。この場合には case 節の式の値が true になる最初の節が実行される。

^o^ > go run switch2.go
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz

無限ループとbreak、continue

for 文で、条件部を省略してただ for と書くと無限ループになる。

ループの制御として、breakcontinue がある。break はループを抜け、continue はループの頭に戻る。
試してみよう。

^o^ > go run for_inf.go
1
2
4
5
7
8
10

for文

Go の繰り返し構文には for しかない。だけどこの for には 3 通りの使い方があって、ひとつは普通の for、ひとつは while 的なもの、そしてもひとつはいわゆる for each 的なものだ。
順番に見ていこう。

まずひとつめ、普通の for。「普通の」というのは、繰り返し用変数の初期化と繰り返し条件、変数の更新処理がある C や JavaScript なんかと同じ、くらいの意味。ただしカッコは要らない。

names := []string{ "Andy", "Bill", "Charlie" } というところは、スライスっていう配列みたいなものを作ってるんだけど、これについては別の機会に書く。
実行してみよう。

^o^ > go run for.go
Andy
Bill
Charlie

ふたつめの使い方は while のようなもの。というか while そのものだ。for の後に繰り返し条件だけを書く。

^o^ > go run for_while.go
Andy
Bill
Charlie

最後はいわゆる for each 的な使い方。range キーワードを使って、スライス(または配列)のインデックスと要素を一つずつ取り出して繰り返す。

^o^ > go run for_range.go
0 Andy
1 Bill
2 Charlie

ここではインデックスを idx 変数で受け取っているけど、場合によっては使わないこともある。そういう時は次のように _ (アンダースコア)で受けてやる。そうしないと idx 変数を使っていない、という警告を受けることになる。アンダースコアは、「ここに入る値は使わないよ」ということを示すものだ。

グローバル変数

変数を関数の外で宣言するとグローバル変数になる。グローバル変数は、同じファイル内のどの関数からでもアクセスできる。

^o^ > go run var_global.go
Hello, Andy!
Good morning, Andy.

関数の中で宣言されているのはローカル変数。ローカル変数はその関数の中だけで使える。

変数の宣言と初期化(2)

先日、変数の宣言と初期化を一緒に行うには「var 変数 = 値」という書き方をする、てなことを書いた。
これ以外に、関数の中に限っては「変数 := 値」という書き方ができる。

^o^ > go run var4.go
Hello, Andy!

if文

if 文はいたって普通。else ifelsif でも elif でもなく else if

^o^ > go run if.go
More than zero.
Less than zero.
Just ZERO!

関数

関数の定義には func キーワードを使う。

引数、返り値とも型を後に書く。珍しいな。
値を返すには return を使う。
試してみよう。

^o^ > go run func.go
Hello, Andy!

数値型

Go にはたくさんの数値型がある。

説明
int8 8bit整数
int16 16bit整数
int32 32bit整数
int64 64bit整数
int 32bitまたは64bit整数(処理系依存)
uint8 8bit符号なし整数
byte uint8の別名
uint16 16bit符号なし整数
uint32 32bit符号なし整数
uint64 64bit符号なし整数
uint 32bitまたは64bit符号なし整数(処理系依存)
float32 32bit単精度浮動小数点数
float64 64bit倍精度浮動小数点数
complex64 float32の実数部と虚数部をもつ複素数
complex126 float64の実数部と虚数部をもつ複素数

整数は通常10進数だけど、頭に 0 をつけると8進数、0x をつけると16進数と解釈される。

型が異なると計算できない。例えば同じ整数でも int と int64 の計算をしようとすると、次のようにエラーになる。

^o^ > go run numbers.go
# command-line-arguments
.\numbers.go:12: invalid operation: a + b (mismatched types int and int64)

こういう場合は明示的に変換しなければならない。

^o^ > go run numbers2.go
30

変数の宣言と初期化

変数を使うには宣言をする必要がある。変数の宣言は var 変数名 型 という形で行う。

宣言と同時に初期化もできる。この場合には型を省略できる。

初期化しないとゼロ値に初期化される。ゼロ値とは、数値型では 0、文字列型では空文字列、bool型では false のこと。

^o^ > go run var3.go
0

false