Go言語_制御構文



条件分岐:if

if文の書き方

Go言語の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)
}

複数条件の定義

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

条件部自体の丸括弧のみが許されていない仕様です。

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)
	}
}

関連ページ



スポンサード リンク