8. 制御構文
Goで使用できる制御構文について紹介します。
- 8.1 繰り返し(for)
- 8.2 条件分岐(if)
- 8.3 条件分岐(switch)
8.1 繰り返し(for)
Goでの繰り返しはforのみです。
他の言語にあるwhileはGoにはありません。
// Like a C for
for 初期化; 条件; 変化 { }
// Like a C while
for 条件 { }
// Like a C for(;;)
for { }
配列、スライス、文字列、チャネル(受信)などはforでrangeを使うことで、要素数だけループすることができます。
// マップ
for key, value := range oldMap {
newMap[key] = value
}
8.2 条件分岐(if)
シンプルなifは以下のようになります。
// only if
if x > 0 {
return y
}
// if, else if, else
if x > 0 {
return a
} else if x < 0 {
return b
} else {
return c
}
ifブロック内で使用するローカル変数の初期化もできます。
if err := file.Chmod(0664); err != nil {
log.Print(err)
return err
}
評価式で使用できるオペレータは以下の通りです。
binary_op = "||" | "&&" | rel_op | add_op | mul_op . rel_op = "==" | "!=" | "<" | "<=" | ">" | ">=" . add_op = "+" | "-" | "|" | "^" . mul_op = "*" | "/" | "%" | "<<" | ">>" | "&" | "&^" . unary_op = "+" | "-" | "!" | "^" | "*" | "&" | "<-" .
8.3 条件分岐(switch)
switchでは以下のように記述ができます。
func unhex(c byte) byte {
switch {
case '0' <= c && c <= '9':
return c - '0'
case 'a' <= c && c <= 'f':
return c - 'a' + 10
case 'A' <= c && c <= 'F':
return c - 'A' + 10
}
return 0
}
case はカンマ区切りで復数条件を指定することもできます。
func shouldEscape(c byte) bool {
switch c {
case ' ', '?', '&', '=', '#', '+', '%':
return true
}
return false
}
type switch
interface型の変数がどの型に当てはまるかを探索する、型スイッチ(type switch)という方法があります。
var t interface{}
t = functionOfSomeType()
switch t := t.(type) {
default:
fmt.Printf("unexpected type %T\n", t) // %T prints whatever type t has
case bool:
fmt.Printf("boolean %t\n", t) // t has type bool
case int:
fmt.Printf("integer %d\n", t) // t has type int
case *bool:
fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool
case *int:
fmt.Printf("pointer to integer %d\n", *t) // t has type *int
}

