조건문은 다른 언어에서도 기본적인 사항이지만, 더욱 간결하게 제공된다. 조건문은 기본적으로 if ~ elseif ~ else, switch ~ case
가 존재한다. switch ~ case
문은 없는 언어도 있기야 한데, 효과는 비슷하더라도 용도가 상당히 다르기 때문에 추가한게 아닐까 싶다.
if ~ else if ~else
Go 언어의 조건문의 경우 파이썬처럼 중괄호가 없다. 그래서인지 파이썬이 아닌 일부 타언어를 하다가 Go 언어를 하는 경우 실수를 할 수도 있다. 그 외에 사용법은 타언어와 같다. 조건에 맞으면 if
, 안맞으면 else if
의 조건을 검사, 그 마저도 안 맞으면 else
블록의 코드를 실행한다.
package main
import "fmt"
func main() {
// -> Hello, Go!
if true {
fmt.Println("Hello, Go!")
} else if true {
fmt.Println("Who are you?")
} else {
fmt.Println("Goodbye")
}
}
변수와 함께 사용하기
조건문을 사용할 때, 변수를 함께 선언할 수 있다. 다음의 코드는 조건문에서 response, err
변수를 함수로부터 받고 그 다음 바로 조건을 검사한다. 조건문의 블록에서 변수를 선언하는 것이 아니라, 조건문의 조건에서 변수를 선언하는 것이다.
package main
import (
"fmt"
"net/http"
)
func main() {
if response, err := http.Get("https://example.com"); err == nil {
// -> 200
fmt.Println(response.StatusCode)
}
}
HTTP GET 요청을 하고 에러 없이 정상적으로 받았다면 HTTP 상태코드를 출력하는 예제이다. 세미콜론을 구분자로 하여 err
변수에 대한 비교연산을 하여 조건을 검사하고 있음을 알 수 있다.
switch ~ case
조건문과 마찬가지로 조건에 따라 행동하지만 Go 언어의 switch ~ case
는 사용법이 기본은 똑같지만 일부분이 타언어와는 조금은 다르다. 일단 break
문이 필요없다. 타언어에서 break
문을 사용하지 않음으로서 발생하는 버그가 많다는 가정하에 break
가 필요하지 않게 설계했다고 한다.
package main
import (
"fmt"
"net/http"
)
func main() {
response, _ := http.Get("https://example.com")
switch response.StatusCode {
case 200:
// -> Successful
fmt.Println("Successful")
case 404:
fmt.Println("Not Found")
default:
fmt.Println("Oops, What is this?")
}
}
새로운 키워드인 fallthrough
를 선택했다. 즉, fallthrough
키워드를 써야 다음으로 넘어갈 수 있는 것이며 그렇지 않으면 해당 케이스에 부합하는 것만 실행하고 멈춘다.
package main
import (
"fmt"
"net/http"
)
func main() {
response, _ := http.Get("https://example.com")
// -> Successful
// -> Not Found
// -> Oops, What is this?
switch response.StatusCode {
case 200:
fmt.Println("Successful")
fallthrough
case 404:
fmt.Println("Not Found")
fallthrough
default:
fmt.Println("Oops, What is this?")
}
}
조건 없이 사용하기
조건을 사용하지 않고 switch ~ case
문을 사용할 수 있다. 이는 타언어에서는 보기 드문 특징이기도 하다. 아래의 코드에서 보이듯 조건을 생략하고 바로 case
를 사용한 것을 볼 수 있다.
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning")
case t.Hour() < 17:
fmt.Println("Good afternoon")
default:
fmt.Println("Good evening")
}
}
변수와 함께 사용하기
조건문처럼 switch ~ case
에서도 조건문과 함께 변수를 선언할 수 있다.
package main
import (
"fmt"
"net/http"
)
func main() {
switch response, _ := http.Get("https://example.com"); response.StatusCode {
case 200:
fmt.Println("Successful")
}
}