프로그래밍 언어/Go

Go: 조건문 (if, switch)

조건문은 다른 언어에서도 기본적인 사항이지만, 더욱 간결하게 제공된다. 조건문은 기본적으로 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")
	}
}