Go
golang

【Go】基本文法②(フロー制御文)


概要

【Go】基本文法①(基礎)に引き続きGo言語学習の為にA Tour of Goの順番に沿ってGoの基本を学習します。


For(ループ)

Goは for によってループ構造を実現します。

for ループは ; によって以下の3つの部分に分かれています。

①初期化ステートメント:最初のイテレーション(繰り返し)の前に初期化が実行されます。

②条件式:各繰り返し毎に評価されます。
③後処理ステートメント: 各繰り返しの最後に実行されます

①初期化ステートメントは、短い変数宣言によく利用され、その変数は for のスコープ内でのみ有効です。

JS等の言語の様に () は必要ありませんが {} は必要です。

package main

import "fmt"

func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
fmt.Println(sum) //=> 0 1 3 6 10
}
}

①初期化ステートメント③後処理ステートメント はあくまでも任意で省略可能です。

また ; も省略可能です。

package main

import "fmt"

func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum) //=> 1024
}


If(条件分岐)

Goの iffor と同様に () は必要ありませんが {} は必要となります。

if ステートメントは、 for のように、条件の前に、評価するための簡単なステートメントを書くことができます。(ここで宣言された変数は、 if のスコープ内だけで有効です。)

package main 

import "fmt"

func condition(arg string)string{
if v := "GO"; arg == v {
return "This is Golang"
}else{
return "This is not Golang"
}
}
func main(){
fmt.Println(condition("Swift")) //=> This is not Golang
}


Switch(条件分岐)

Go では選択された case だけを実行してそれに続く全ての case は実行されません。

package main 

import "fmt"

func main(){
lang := "Go"

switch lang {
case "Ruby":
fmt.Println("This is Ruby")
case "Go":
fmt.Println("This is Go")
default:
fmt.Println("This is a programming language")
}
// => This is Go
}

switchの前に何も条件を書かない場合はswitch trueと書くのと同じです。

if~then~elseの構文をよりシンプルに書くことが可能です。

package main 

import "fmt"

func main(){
lang := "Go"

switch {
case lang == "Ruby":
fmt.Println("This is Ruby")
case lang == "Go":
fmt.Println("This is Go")
default:
fmt.Println("This is a programming language")
}
// => This is Go
}


Defer(遅延実行)

deferへ渡した関数の実行を呼び出し元の関数の終わり(returnする)まで遅延させます。

以下の例ではdeferに渡した関数(fmt.Println("World"))が呼び出し元の関数(func main())の終わりまで遅延されています。

package main 

import "fmt"

func main(){
defer fmt.Println("World")
fmt.Println("Hello")
//=> Hello
//=> World
}


複数の関数をdeferに渡した場合

deferへ渡した関数が複数ある場合、その呼び出しはスタックされます。

呼び出し元の関数がreturnするとき、deferへ渡した関数は新しいデータ→古いデータLIFO(last-in-first-out)の順番で実行されます。

つまり、最初にdeferされた行が一番最後に実行される構造になります。

package main 

import "fmt"

func main(){
defer fmt.Println("Golang") //defer1
defer fmt.Println("Ruby") //defer2
fmt.Println("JS")
//=> JS
//=> Ruby
//=> Golang
}

上記の例では元の関数func main()中のfmt.Print("JS")を実行した後により新しい情報であるfmt.Print("Ruby")を実行し、最後にもっとも古い情報であるfmt.Print("Golang")を実行しています。


参考

My Journey of Go②

A Tour of Go