3 분 소요

Keywords


Go언어의 키워드는 총 25개가 있다.

break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

Break


동일 함수내의 가장 안쪽에 있는 "for","switch" 혹은 "select"문의 실행을 종료한다.

BreakStmt = "break" [ Label ] .

레이블이 있는 경우 "for","switch" 혹은 "select"문을 둘러싸고 실행이 종료되는 레이블이어야 한다.

OuterLoop:
  for i = 0; i < n; i++ {
    for j = 0; j < m; j++ {
      switch a[i][j] {
      case nil:
        state = Error
        break OuterLoop
      case item:
        state = Found
        break OuterLoop
      }
    }
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
OuterLoop:
  for i = 0; i < n; i++ {
    for j = 0; j < m; j++ {
      switch a[i][j] {
      case nil:
        state = Error
        break OuterLoop
      case item:
        state = Found
        break OuterLoop
      }
    }
  }

Case, Switch, Default


"switch" 문은 다방향 실행을 제공한다. "switch"안에서 표현식(Expression) 또는 타입을 "case"들과 비교하여 어떠한 것을 실행할 지 결정한다.
"switch"에는 표현식(Expression)과 타입의 두 가지 형식이 있다.

표현식 스위치
go언어는 "switch"뒤에 표현식(Expression)이 생략이 가능하다. 생략시에는 첫번째 "case"문 부터 검사를 시작한다.
"case"문과 일치하는 결과가 없을경우 "default"을 실행한다.

1
2
3
4
switch {
  case x < y: f1()
  case x >= y: f2()
}

"case"문과 일치하는 결과가 없을경우 "default"을 실행한다. 여러개의 "case"의 실행값이 일치할 경우 콤마(,)로 지정할 수 있다.

1
2
3
4
5
6
switch grade {
  default: f4()
  case 1,2: f1()
  case 3,5,6: f2()
  case 7: f3()
}

"case"문과 일치하는 결과가 없을경우 "default"을 실행한다. 여러개의 "case"의 실행값이 일치할 경우 콤마(,)로 지정할 수 있다.

1
2
3
4
5
6
switch grade {
  default: f4()
  case 1,2: f1()
  case 3,5,6: f2()
  case 7: f3()
}

"switch"뒤에 변수를 바로 초기화 할 수 있다.

1
2
3
4
switch x := f(); {
  case x < 0: return -x
  default: return x
}

go의 switch는 일치하는 "case"가 있을 경우 "break"가 없더라도 다음 "case"문으로 넘어가지 않는다.
만약 다른 언어처럼 다음 "case"문으로 넘어가고 싶다면 명시적으로 "fallthrough"문을 사용한다.
단, 다음 "case"의 수식이 일치하지 아니더라도 실행되므로 주의하여야 한다.
"fallthrough"문은 마지막 "case"에는 사용할 수 없으며 또한, 타입 스위치에는 사용할 수 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
grade := 2

switch grade {
  case 1:
    fmt.Println("값은 1입니다.")
    fallthrough
  case 2:
    fmt.Println("값은 2입니다.")
    fallthrough
  case 3:
    fmt.Println("값은 3입니다.")
    fallthrough
  case 4:
    fmt.Println("값은 4입니다.")
  case 5:
    fmt.Println("값은 5입니다.")
}

위의 구문 실행 순서는 다음과 같다.

  1. "case"문인 "case 1"을 비교하여 일치하지 않으므로 "case 2"로 넘어간다.
  2. "case 2"가 일치하므로 원래는 "break"되어 switch문을 빠져나가야 하나 "fallthrough"가 있으므로 "case 3"으로 넘어간다.
  3. "case 3"이 비록 false일지라도 "fallthrough"로 인하여 무조건 실행된다. 실행 후 "fallthrough"로 인하여 "case 4"로 넘어간다.
  4. "fmt.Println("값은 4입니다.")"를 출력 후 "case"문이 "false"이므로 종료한다.

위의 실행 결과값은 다음과 같다.

1
2
3
값은 2입니다.
값은 3입니다.
값은 4입니다.

타입 스위치
타입을 비교할 때 사용하며 "type"예약어를 사용한다.
x는 "interface"타입이어야만 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// x의 타입을 비교하여 그 결과를 i에 대입한다.
switch i := x.(type) {
  case nil:
    printString("x is nil")                // i의 타입은 x의 타입인 interface{}
  case int:
    printInt(i)                            // i의 타입은 int
  case float64:
    printFloat64(i)                        // i의 타입은 float64
  case func(int) float64:
    printFunction(i)                       // i의 타입은 func(int) float64
  case bool, string:
    printString("type is bool or string")  // i의 타입은 bool 혹은 string
  default:
    printString("don't know the type")     // i의 타입은 interface{}
}

Chan


동일 함수내의 가장 안쪽에 있는 "for","switch" 혹은 "select"문의 실행을 종료한다.

BreakStmt = "break" [ Label ] .

레이블이 있는 경우 "for","switch" 혹은 "select"문을 둘러싸고 실행이 종료되는 레이블이어야 한다.

OuterLoop:
  for i = 0; i < n; i++ {
    for j = 0; j < m; j++ {
      switch a[i][j] {
      case nil:
        state = Error
        break OuterLoop
      case item:
        state = Found
        break OuterLoop
      }
    }
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
OuterLoop:
  for i = 0; i < n; i++ {
    for j = 0; j < m; j++ {
      switch a[i][j] {
      case nil:
        state = Error
        break OuterLoop
      case item:
        state = Found
        break OuterLoop
      }
    }
  }

댓글남기기