LoginSignup
20
8

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

Last updated at Posted at 2018-08-06

概要

A Tour of Goの順番に沿ってGoの基本で個人的に学習したことをまとめています。

No 記事
1 【Go】基本文法①(基礎)
2 〜〜【Go】基本文法②(フロー制御文)「今ココ」〜〜
3 【Go】基本文法③(ポインタ・構造体)
4 【Go】基本文法④(配列・スライス)
5 【Go】基本文法⑤(Maps・ Range)
6 【Go】基本文法⑥(インターフェース)
7 【Go】基本文法⑦(並行処理)
8 【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の if for と同様に () は必要ありませんが {} は必要となります。
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

20
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
8