Skip to content

Go 조건 제어

Go 에서 조건 제어 문장은 총 세 가지if, switch, select가 있습니다. select는 앞의 두 가지에 비해 비교적 특수하며, 본 절에서는 설명하지 않고并发 섹션에서 다시 소개하겠습니다.

if else

if else는 최대 두 개의 판단 분기를 가지며, 문장 형식은 다음과 같습니다.

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

두 번째 작성법은 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

레이블 문장은 코드 블록에 레이블을 붙이며, goto, break, continue의 대상이 될 수 있습니다. 예시는 다음과 같습니다.

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