Go言語_制御構文

条件分岐:if

if文の書き方

Go言語のif文では、以下のような記述ルールがあります。

  • 条件部に丸括弧を付けられません。
  • 本件部の波括弧は省略することができません。
  • 次条件式は「else if」とスペースが必要です。

package main

import "fmt"

func main() {
	x, y := 20, 30
	if x > y {
		fmt.Println("x is larger than y")
	} else if x < y {
		fmt.Println("x is smaller than y")
	} else {
		fmt.Println("x equals y")
	}
}

条件部で一時的な変数を定義する

初期化ステートメントを記述できるため、条件部で一時的に利用する変数を作成できます。


package main

import (
	"errors"
	"fmt"
	"os"
)

func retError(flag bool) error {
	if flag {
		return errors.New("Error is occured.")
	}
	return nil
}

func main() {
	if err := retError(true); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	os.Exit(0)
}

複数条件の定義

複雑な条件式を記述する際には、丸括弧を使用することができます。

とはいえ、Go言語では条件部自体の丸括弧のみが許されていない仕様となっています。


package main

import "fmt"

func main() {
	x := 15
	y := -1
	if ((x > 0) && (x < 10)) || (y < 0) {
		fmt.Println("match")
	}
}

条件分岐:switch

switch文の書き方

switch文では、case に単一の値だけでなく、カンマで区切った値も指定できます。

defaultを定義すると、いずれのcaseにも一致しなかった場合に処理が実行されます。(defaultを省略することもできます。)


package main

import "fmt"

func main() {
	n := 9
	switch n {
	case 2, 3, 5, 7:
		fmt.Println("Prime number")
	case 4, 6, 8:
		fmt.Println("Odd number")
	case 1, 9:
		fmt.Println("Even number")
	case 0:
		fmt.Println("zero")
	default:
		fmt.Println(n)
	}
}

fallthrough

Go言語のswitch文は、caseが1つ実行されると次のcaseに実行が移ることなく switch 文が終了します。

したがって、C言語などのようにbreak文を記述する必要はありません。


しかし、意図的にcaseの処理が終わったあとに、次のcaseに処理を進めたい場合もあります。

その場合は、case内に「fallthrough」を書くことで、次のcaseに処理を進めることができます。


package main

import "fmt"

func main() {
	n := 1
	switch n {
	case 1:
		n++
		fallthrough
	case 2:
		n = n + 2
		fallthrough
	case 4:
		n = n * 4
		fallthrough
	default:
		fmt.Println(n) //16
	}
}

条件式での分岐

Go言語のswitch文では、caseに式を指定することができます。

ただし、caseの型は統一する必要があります。式の成否がbool型で判定される場合に、数値caseと組み合わせることはできません。


package main

import "fmt"

func isPositiveNumber(num int) bool {
	if num < 0 {
		return false
	}
	return true
}

func main() {
	n := 15
	switch {
	case isPositiveNumber(n):
		fmt.Println("n is negative number")
		fallthrough
	case n%3 == 0:
		fmt.Println("n is odd number")
	case n%2 == 0:
		fmt.Println("n is even number")
	}
}

反復処理:for

基本形

Go言語のfor文では、if文と同じく、条件部の丸括弧を記述しません。

基本形は他言語と同じく、「for 初期化; 条件; 制御 {}」となります。


package main

import "fmt"

func main() {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
	}
}

反復処理はfor文のみ

Go言語で繰り返しを表現する方法はfor文のみです。

ほかの言語におけるwhile文やdo/while文、loop文といったような表現は、すべてfor文を用いて行います。


while文の実現

Go言語のfor文では、for文の初期化や制御を省略できます。

for文に条件のみ記述すれば、while文を実現できます。

さらに、全て省略して「for {}」とすれば無限ループ処理を実現できます。


package main

import "fmt"

func main() {
	n := 0
	for n < 10 {
		fmt.Printf("n = %d\n", n)
		n++
	}
}

break/continue

繰り返し制御において、ループを終了する「break」と、ループの最初から処理を再開する「continue」が用意されています。

無限ループの書き方と組み合わせて、素数一覧を出力する例を挙げてみます。


package main

import "fmt"

// !
// @brief     素数判定
// @param[in] num 数値
// @retrun    素数ならばtrueを返し、素数でなければfalseを返す。
//
func checkPrimeNumber(num int) bool {
	for i := 2; i < num; i++ {
		if num%i == 0 {
			return false
		}
	}
	return true
}

func main() {
	n := 1
	for { // Go言語での無限ループ定義
		n++
		if n > 500 {
			break
		}
		if !checkPrimeNumber(n) {
			continue
		}
		fmt.Printf("%d ", n)
	}
	fmt.Printf("\n")
}

foreachの実現

rangeキーワードを用いることでイテレータ処理が行えます。


package main

import "fmt"

func main() {
	var array []int = []int{1, 2, 3, 4, 5}

	for _, num := range array {
		fmt.Printf("%d\n", num)
	}
}

関連ページ