Skip to content

Go 条件制御

Go での条件制御ステートメントは 3 種類あります:ifswitchselectselect は他の 2 つと比較して特殊であり、このセクションでは説明せず、並行処理のセクションで改めて紹介します。

if else

if else は最大 2 つの判断分岐を持ちます。ステートメントの形式は以下の通りです。

go
if expression {

}

または

go
if expression {

}else {

}

expression は布尔式でなければなりません。つまり、結果は真または偽のいずれかであり、布尔値である必要があります。例を以下に示します。

go
func main() {
   a, b := 1, 2
   if a > b {
      b++
   } else {
      a++
   }
}

式をより複雑に書くこともできます。必要に応じて可読性を向上させるために、括弧を使用してどの式を優先的に計算するかを明示的に示す必要があります。

go
func main() {
   a, b := 1, 2
    if a<<1%100+3 > b*100/20+6 { // (a<<1%100)+3 > (b*100/20)+6
      b++
   } else {
      a++
   }
}

また、if ステートメントにはいくつかのシンプルなステートメントを含めることもできます。

go
func main() {
  if x := 1 + 1; x > 2 {
    fmt.Println(x)
  }
}

else if

else if ステートメントは if else を基に、より多くの判断分岐を作成できます。ステートメントの形式は以下の通りです。

go
if expression1 {

}else if expression2 {

}else if expression3 {

}else {

}

実行プロセス中、各式の判断は左から右へ、if ステートメント全体の判断は上から下へ行われます。成績に基づいてスコアを付ける例を以下に示します。

最初の書き方:

go
func main() {
   score := 90
   var ans string
   if score == 100 {
      ans = "S"
   } else if score >= 90 && score < 100 {
      ans = "A"
   } else if score >= 80 && score < 90 {
      ans = "B"
   } else if score >= 70 && score < 80 {
      ans = "C"
   } else if score >= 60 && score < 70 {
      ans = "E"
   } else if score >= 0 && score < 60 {
      ans = "F"
   } else {
      ans = "nil"
   }
   fmt.Println(ans)
}

2 番目の書き方は、if ステートメントが上から下に判断するという前提を利用して、コードをより簡潔にしています。

go
func main() {
  score := 90
  var ans string
  if score >= 0 && score < 60 {
    ans = "F"
  } else if score < 70 {
    ans = "D"
  } else if score < 80 {
    ans = "C"
  } else if score < 90 {
    ans = "B"
  } else if score < 100 {
    ans = "A"
  } else if score == 100 {
    ans = "S"
  } else {
    ans = "nil"
  }
  fmt.Println(ans)
}

switch

switch ステートメントも多分岐の判断ステートメントです。ステートメントの形式は以下の通りです。

go
switch expr {
  case case1:
    statement1
  case case2:
    statement2
  default:
    default statement
}

簡単な例を以下に示します。

go
func main() {
   str := "a"
   switch str {
   case "a":
      str += "a"
      str += "c"
   case "b":
      str += "bb"
      str += "aaaa"
   default: // すべての case に一致しない場合、default 分岐が実行されます
      str += "CCCC"
   }
   fmt.Println(str)
}

式の前にいくつかのシンプルなステートメントを記述することもできます。例えば、新しい変数を宣言するなどです。

go
func main() {
  switch num := f(); { // switch num := f(); true { と同等
  case num >= 0 && num <= 1:
    num++
  case num > 1:
    num--
    fallthrough
  case num < 0:
    num += num
  }
}

func f() int {
  return 1
}

switch ステートメントには、エントリーポイントの式がない場合もあります。

go
func main() {
   num := 2
   switch { // switch true { と同等
   case num >= 0 && num <= 1:
      num++
   case num > 1:
      num--
   case num < 0:
      num *= num
   }
   fmt.Println(num)
}

fallthrough キーワードを使用して、隣接する次の分岐を継続して実行します。

go
func main() {
   num := 2
   switch {
   case num >= 0 && num <= 1:
      num++
   case num > 1:
      num--
      fallthrough // この分岐を実行した後、次の分岐を継続して実行します
   case num < 0:
      num += num
   }
   fmt.Println(num)
}

label

ラベルステートメントは、コードブロックにラベルを付けます。gotobreakcontinue のターゲットになります。例を以下に示します。

go
func main() {
  A:
    a := 1
  B:
    b := 2
}

ラベルを単独で使用しても意味はありません。他のキーワードと組み合わせて使用する必要があります。

goto

goto は、同一関数内の対応するラベルのステートメントに制御権を移します。例を以下に示します。

go
func main() {
   a := 1
   if a == 1 {
      goto A
   } else {
      fmt.Println("b")
   }
A:
   fmt.Println("a")
}

実際のアプリケーションでは、goto はほとんど使用されません。飛び飛びの移動はコードの可読性を低下させ、パフォーマンスの消耗も問題となります。

Golang by www.golangdev.cn edit