目次へ

8. 制御構文

Goで使用できる制御構文について紹介します。

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
}

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp