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 }