こんにちは、イサムです!
本記事では、前回に引き続きGo言語の基本文法についてまとめます。
- Go言語の基本文法について知りたい!
- Go言語の基本文法についてのまとめ
制御構文
if文
条件式によって、処理を分岐できます。
if 条件式{}で条件式がtrueなら{}内の処理を実行し、falseの場合、else if 条件式{}があればifの次にその条件式を評価します。その判定がtrueであれば、else ifの{}内の処理を実行し、falseであれば、else{}の{}内の処理を実行をします。
Go言語の場合、条件式を()で囲いません。
a := 3
if a==1 {
println("aは、1です")
} else if a == 2 {
println("aは、2です")
} else {
println("aは、1と2以外です")
}
if-else文内だけのスコープを持つ変数を宣言できます。
if a := 2; a==1 {
println("aは、1です")
} else if a == 2 {
println("aは、2です")
} else {
println("aは、1と2以外です")
}
for文
for 初期化文; 条件式; 更新文{}で繰り返し処理ができます。
初期化文は、最初のイテレーション(繰り返し)の前に初期化が実行されます。
条件式は、イテレーション事に評価され、条件式の評価がfalseになった場合、for文の処理は終了します。
更新文は、イテレーション毎の最後に実行されます。
for i := 0; i < 10 ; i++ {
println(i)
}
for 条件式{}でも繰り返し処理ができます。(初期化文と更新文は、省略可能です。)
i := 0
for i < 10 {
println(i)
i++
}
for {}で無限ループになります。
i := 0
for {
println(i)
i++
}
rangeキーワードでも繰り返し処理ができます。
for i, v := range []int{1, 2, 3}{
println(i, v)
}
break
breakキーワードを使用することで、breakのあるfor文のみ抜けることができます。
for i := 0; i < 10 ; i++ {
if i == 5 {
break // iが5になったらfor文抜ける
}
println(i) // 0 , 1, 2, 3, 4
}
ラベル付きfor文
任意のラベルを付けることで、ラベルがある位置まで抜けることができます。
Loop:
for {
for {
for {
fmt.Println("START")
break Loop // Loopのところまで抜ける
}
fmt.Println("処理しない")
}
fmt.Println("処理しない")
}
fmt.Println("END")
return
returnキーワードでもfor文を抜けることができますが、return以降の処理はスキップされます。
for i := 0; i < 10 ; i++ {
return
}
println("処理しない")
switch文
switch 式{}で処理の分岐ができ、case 値: で式の結果と一致した値のcase文が実行されます。式と値は同じ型である必要があります。
他の言語では、case式の最後にbreakキーワードが必要ですが、Go言語では、自動的に提供されるため不要です。
switch文は、上から下へ評価していき、caseの条件が一致すれば、そこの処理を行い、自動的にbreakします。
case文の処理が終了したらswitchブロックを抜けますが、fallthroughを使用することでそのまま次のcaseの評価を行うことできます。
a := 2
switch a {
case 1:
println("aは、1です")
case 2:
println("aは、2です")
fallthrough // 次のcaseの評価を行う
case 3, 4:
println("aは、3または4です")
default:
println("aは、1~4以外です")
}
case文でも式を使えるが、その場合、swtichの後ろに式は書けません。
それぞれのcase文で異なるデータ型を使用することができます。
a := 1
switch {
case a==1:
println("aは、1です")
case "a" == "1":
println("aは、文字列です")
}
関数
func 関数名(引数1, 引数2, …) 戻り値の型 { 戻り値1, 戻り値2, …}で一連の処理をまとめたもので、関数も変数の1つになります。
引数や戻り値を定義でき、引数で受け取った値を基に処理を行い、戻り値として結果を返すことができます。(引数や戻り値を必ず使用しなくても大丈夫です。)
戻り値がある場合、戻り値の型を宣言する必要があります。
基本的な関数の宣言方法
- 引数, 戻り値なし
- 引数あり
- 同じ型の引数
- 戻り値あり
- 戻り値複数
- 名前付き関数
- 可変長引数
// ①引数, 戻り値なし
func Fn1() {
...
}
// ②引数あり
func Fn2(s string, a int) {
...
}
// ③同じ型の引数
func Fn3(a, b int) {
...
}
// ④戻り値あり
func Fn4() int {
a := 10
return a
}
// ⑤戻り値複数
func Fn5() (int, int) {
a, b := 10, 20
return a, b
}
// ⑥名前付き関数
func Fn6() (a int) {
...
return // 戻り値を指定しなければ、戻り値で指定した名前付きの変数(a)が返される
}
// ⑦可変長引数(呼び出す際に引数の数を変更できる)
func Fn7(s ...string) {
...
}
複数戻り値の受け取り方
- 全ての戻り値を受け取る
- 一部の戻り値を受け取る
- ブランク変数「_」 を使用して省略
func multiReturnValue() (int, int){
return 10, 20
}
func main() {
// ①全ての戻り値を受け取る
a, b := multiReturnValue()
println(a, b)
// ②一部の戻り値を受け取る
c, _ := multiReturnValue()
println(c)
}
無名関数
無名関数とは名前が無い関数のことで、関数内で定義することができます。
重複しない名前を考える手間を省くことができます。
無名関数は、無名関数外のデータも参照することができます。
無名関数の宣言方法
- 無名関数を定義と同時に実行
- 無名関数を変数に代入して実行
// ①無名関数を定義と同時に実行
func main() {
name := "Osamu"
func() {
println(name)
}() // ()をつけることで無名関数を実行
}
// ②無名関数を変数に代入して実行
func main() {
name := "Osamu"
disp := func() {
println(name)
}
disp()
}
init関数
init関数は、main関数実行前に最初に呼び出すことができる関数のことです。
複数定義できますが呼び出し順は決まっていません。
init関数の宣言方法
func init() {
println("init1")
}
func init() {
println("init2")
}
func main() {
println("main")
}
defer
deferは、deferへ渡した関数を、呼び出し元の関数の終わりまで実行を遅れらせることができるものです。
deferへ複数の関数を渡した場合、最後に渡した関数から順(Last-In-Frist-Out)に実行されます。
特にメモリーリークしないように、関数終了時に実行する関数を登録します。
deferの宣言方法
func Fn() {
defer f(1) // 3番に実行される
defer f(2) // 2番に実行される
defer f(3) // 1番に実行される
}
まとめ
この記事では、前回に引き続きGo言語の基礎文法をまとめました。
少しGo言語をいじってみたいと思ったら、ブラウザ上で実行できる公式チュートリアルでコードを実際に書いてみると雰囲気がつかめるかもしれません。
今後、さらにGo言語のことについて記事にしていきたいと思います。
もし「記事の内容が間違えている!」等ありましたら、Twitterまたはお問い合わせフォームからご連絡いただければと思います。
最後までご覧いただきありがとうございました。