조건, 반복, 분기문에 대해 알아본다. Java 나 C/C++ 대비 다른 부분만 설명하도록 하겠다. 일반적인 부분은 느낌대로 쓰면 된다. 뭔가 잘못되면 문법 오류가 바로 뜰테니 몇번 만나면 익숙해진다.

▌if

if <조건> { 처럼 사용, 중괄호 “{“ 가 반드시 inline 으로 와야한다. 중괄호를 생략해도 에러난다.
조건문에는 괄호 () 가 오지 않는다.
if err != nil {
   utils.Fatalf("Unlock error: %v"err)
}

if 의 block 이 끝나는 중괄호와 같은 라인에 else { 가 와야 한다
if script := ctx.GlobalString(utils.ExecFlag.Name)script != "" {
   repl.batch(script)
else {
   repl.welcome()
   repl.interactive()
}

} else if <조건> { 과 같이 else if 문도 inline 이어야 한다
if entry := GetHeader(dbheader.Hash())entry == nil {
   t.Fatalf("Stored header not found")
else if entry.Hash() != header.Hash() {
   t.Fatalf("Retrieved header mismatch: have %v, want %v"entryheader)
}

if <조건문> 내에서 함수 실행. 세미콜론 ; 으로 구분하여 if 구문 안에서 하고자 하는 작업을 선행할 수 있다. 
if berr := ioutil.ReadFile("./hello.txt")err == nil {
fmt.Printf("%s"b)
}

위에서 ioutil 패키지는 []byte, error 를 동시리턴하도록 되어있다. 나중에 다룰 내용이지만 이 동시리턴 된 값중 error 값을 조사하여 error 가 있으면 if block 을 실행하는 예제이다.

위에서 if 조건문에서 사용한 b, err 변수는 if 문 바깥에서는 사용할 수 없다


▌for

Go 에는 do…while 이나 while 이 없고 for 반복문만 제공됨
if 문 처럼 for <조건문> 에서도 괄호 () 를 사용하지 않으며 { 는 inline 으로 붙어야 함

for 문에 <조건문> 을 주지 않으면 무한루프를 돈다
func main() {
   for {
      fmt.Println("무한 루프")
   }
}


▌루프 Label 과 break, continue

Go 에서는 break 와 continue 시에 Loop Label 을 지원함
Label 은 for 문 바로 윗줄에 쓰여야 함
func main() {
   OutterLoop:
   for i := 0i < 10i++ {
      for j := 0j < 10j++ {
         if i == && j == {
            break OutterLoop
         } else if j == {
            continue OutterLoop
         }

         fmt.Println(ij)
      }
   }
}
결과
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1

▌switch

Go 의 switch 문에서는 switch / case 만 쓰면 되며, 매 case 마다 break 를 사용할 필요가 없다.
조건에 만족하지 않으면 default: 라벨로 간다
case 에 “문자열” 을 쓸 수 있다.
func main() {
   str := "굿준"
   switch str {
   case "굿준":
      fmt.Println(str"'s Blog")
   default:
      fmt.Println("DEFAULT")
   }
}

그러나 여전히 break 문을 case 를 빠져나오기 위해 사용할 수 있다. (if 문 안에서..)

case 안에서 fallthrough 키워드를 사용하면 java 나 C/C++ 에서 break 문이 없는것과 같이 다음 case 로 넘어가는 효과를 낼 수 있다
func main() {
   str := "굿준"
   switch str {
   case "굿준":
      fmt.Print(str)
      fallthrough // 다음 case 로 흘러간다
   case "블로그":
      fmt.Println("'s 블로그")
   default:
      fmt.Println("DEFAULT")
   }
}

결과
굿준's 블로그

case 안에서 여러 조건을 함께 처리할 수 있다. case 의 값을 콤마 , 로 분리하면 된다.
func main() {
   str := "굿준"
   switch str {
   case "굿준""개발자":
      fmt.Print(str)
      fallthrough // 다음 case 로 흘러간다
   case "블로그""트위터""페이스북":
      fmt.Println("'s 블로그")
   default:
      fmt.Println("DEFAULT")
   }
}

switch 안에서 조건식도 사용 가능하다. 조건문 안에서 함수를 호출하고 case 로 분기하는 예제이다.
이때 조건문 안에서의 함수호출 다음에는 반드시 세미콜론 ; 이 와야한다.
func main() {
   val1 := 100

   rand.Seed(time.Now().UnixNano())
   switch swVal := val1 + rand.Intn(10)// 조건문 안에서의 함수호출은 ; 필수!
   case swVal > 100 && swVal < 200:
      fmt.Println("100 보다 크고 200보다 작음")
   case swVal >= 200 :
      fmt.Println("200 보다 크거나 같음")
      fallthrough
   default:
      fmt.Println("많이 큼")
   }
}

그리고, 함수가 호출된 경우에는 case 문의 값은 <조건식> 만 가능하다.

반응형

'Software Development > Go (golang)' 카테고리의 다른 글

3.3 Go - Package  (4) 2016.03.01
3.2 Go - 기본 문법 및 Type  (488) 2016.02.29
3.1 Go - Hello World  (5) 2016.02.29
2. Go - 개발환경 구성  (520) 2016.02.28
1.3 Go 언어란? - 다른 언어와 비교  (1159) 2016.02.28
블로그 이미지

Good Joon

IT Professionalist Since 1999

,