Featured image of post Golang: 2. 조건문

Golang: 2. 조건문

if 문

if 문은 해당 조건이 맞으면 {} 블럭 안의 내용을 실행한다.

  • 조건식을 ()로 둘러 싸지 않아도 된다.
  • 조건 블럭 시작 { 를 if문과 같은 라인에 두어야 한다.
1
2
3
4
5
6
7
if k == 1 {
    println("One")
} else if k == 2 {  //같은 라인
    println("Two")
} else {   //같은 라인
    println("Other")
}

Optional Statement

if문에서 조건식을 사용하기 이전에 간단한 문장(Optional Statement)을 함께 실행할 수 있다.

1
2
3
4
5
6
if val := i * 2; val < max {
    println(val)
}
 
// 아래 처럼 사용하면 Scope 벗어나 에러
val++

val := i * 2 처럼 조건식 이전에 연산을 실행할 수 있는데, 정의된 변수 val의 범위는 if-else 블럭이다.

if문 외에도 switch, for 에서도 사용할 수 있다.

switch 문

다른 언어들과 비슷하게 하나의 변수를 지정하고 case문에 해당 변수가 가질 수 있는 값들을 지정하여 case 블럭을 실행한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main
 
func main() {
    var name string
    var category = 1
 
    switch category {
    case 1:
        name = "Paper Book"
    case 2:
        name = "eBook"
    case 3, 4:
        name = "Blog"
    default:
        name = "Other"
    }
    println(name)
     
    // Expression을 사용한 경우
    switch x := category << 2; x - 1 {
        //...
    }   
}

다른 언어와 차이점

C++, C#, Java 등과 조금 다르게 동작한다.

switch 뒤에 expression이 없을 수 있음

다른 언어는 switch 키워드 뒤에 변수나 조건식을 두지만, Go는 쓰지 않아도 된다. 이런 경우 true로 간주하고 첫번째 case문으로 이동하여 검사한다.

case문에 조건식 쓸 수 있음

다른 언어는 일반적으로 값을 갖지만, Go는 조건식을 쓸 수 있다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
func grade(score int) {
    switch {
    case score >= 90:
        println("A")
    case score >= 80:
        println("B")
    case score >= 70:
        println("C")
    case score >= 60:
        println("D")
    default:
        println("No Hope")
    }
}

No default fall through

case문에 기본적으로 break를 적용한다. 다음 case로 넘어가려면 fallthrough 키워드를 쓴다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func check(val int) {
    switch val {
    case 1:
        fmt.Println("1 이하")
        fallthrough
    case 2:
        fmt.Println("2 이하")
        fallthrough
    case 3:
        fmt.Println("3 이하")
        fallthrough
    default:
        fmt.Println("default 도달")
    }
}

Type switch

switch 뒤 변수의 타입으로 분기할 수 있다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
switch v.(type) {
case int:
    println("int")
case bool:
    println("bool")
case string:
    println("string")
default:
    println("unknown")
}