こんにちは。
暇な時に、経験がないことを触ってみたいと思いましたから、Go言語の勉強を始めました。
まず、Go言語の構文について紹介させていただきます。
1. パッケージ
Goのプログラムは、パッケージで構成されます。
書いているパッケージに、括弧で他のパッケージのインポートをグループ化し、factoredインポートステートメント( factored import statement )と言うことはできます。
package main import ( "fmt" "math" ) func main() { fmt.Println(math.Pi) }
2. 関数
Go言語で、関数のキーワードはfunc
です。
関数は、0個以上の引数を取ることができます。
型名は変数名の後ろに書かれます。
関数は複数の戻り値を返すことができます。
package main import "fmt" func addAndSub(x, y int) (int, int) { return x + y, y-x } func main() { fmt.Println(addAndSub(5, 10)) }
上記のプログラムの出力結果は 15 5
です。
3. 変数
Go言語で、変数を宣言するためのキーワードはvar
です。
関数の中では、 var
宣言の代わりに、短い:=
の代入文を使えます。
なお、関数の外では、キーワードではじまる宣言(var
, func
, など)が必要で、 :=
での暗黙的な宣言は利用できません。
package main import "fmt" var i, j int = 1, 2 func main() { k := 3 fmt.Println(i, j, k) }
上記のプログラムの出力結果は 1 2 3
です。
4. Forループ
Go言語で、for
ステートメントの3つの部分を括る括弧 ( )
はありません。
初期化ステートメントと後処理ステートメントがない場合、他の言語(JavaやPHPなど)のwhile
ステートメントとして使えます。
package main import "fmt" func main() { for i := 0; i < 10; i++ { fmt.Println(i) } check:= false for !check { fmt.Println("Hello World") check = true; } }
5. Ifステートメント
Go言語で、if
ステートメントは、先ほどの for
ループと同様に、括弧 ( )
は不要で、中括弧 { }
は必要です。
package main import ( "fmt" ) func signOfNum(x int) string { if (x > 0) { return "positive" } else if (x < 0) { return "negative" } else { return "zero" } } func main() { fmt.Println(signOfNum(2)) }
6. Switchステートメント
Go言語で、switch
は他の言語(JavaやPHPなど)の switch と似ていますが、下記に重要な2つの違いことはあります。
- 選択された
case
だけを実行してそれに続く全てのcase
は実行されません。 他の言語(JavaやPHPなど)のcase
の最後に必要なbreak
ステートメントが Go では自動的に提供されます。 switch
のcase
は定数である必要はなく、 関係する値は整数である必要もありません。
package main import ( "fmt" "time" ) func main() { fmt.Println("When's Saturday?") today := time.Now().Weekday() switch time.Saturday { case today + 0: fmt.Println("Today.") case today + 1: fmt.Println("Tomorrow.") case today + 2: fmt.Println("In two days.") default: fmt.Println("Too far away.") } }
Go言語で、switch
条件のないswitch
は、switch true
と書くことと同じです。
package main import ( "fmt" "time" ) func main() { t := time.Now() switch { case t.Hour() < 12: fmt.Println("Good morning!") case t.Hour() < 17: fmt.Println("Good afternoon.") default: fmt.Println("Good evening.") } }
7. Deferステートメント
Go言語で、defer
へ渡した関数の引数は、すぐに評価されますが、その関数自体は呼び出し元の関数がreturn
するまで実行されません。
defer
へ渡した関数が複数ある場合、その呼び出しはスタックされます。 呼び出し元の関数がreturn
するとき、 defer
へ渡した関数は LIFO(last-in-first-out) の順番で実行されます。
package main import "fmt" func main() { count:=0; for i := 0; i < 3; i++ { count++; defer fmt.Println(count) } fmt.Println("done") fmt.Println(count) }
上記のプログラムの出力結果は:
done 3 3 2 1
参考書類
今回の記事でGoの構文について少し紹介しました。
詳しい情報は下記のリンクにご参考ください。