제어문 - switch

switch

package main

import "fmt"

func main() {
	// switch 뒤 표현식 생략 가능
	// case 뒤 표현식 사용 가능
	// 값이 아닌 type으로도 분기 가능

	// switch문 기본 형태
	num := 0
	switch { 
	case num > 0:
		fmt.Println("양수")
	case num == 0:
		fmt.Println("0")
	case num < 0:
		fmt.Println("음수")
	}

 
	//case 내 if문 사용
  x := 0
	switch {
	case x>0:
		fmt.Println("양수")
	case x<=0:
		if x < 0 {
			fmt.Println("음수")
		} else {
			fmt.Println("0")
		}
	}

	// switch문 안에서 짧은 선언 이용. 해당 변수는 해당 switch문 안에서만 사용가능
	switch a := 10; {
	case a > 0:
		fmt.Println("양수")
	case a < 0:
		fmt.Println("양수")
	default:
		fmt.Println("0")
	}

	// switch의 표현식 값이 case의 조건과 일치할 때 해당 case 실행
	// ex1)
	var b = -1
	switch b>=0 {
	case true:
		fmt.Println("0 이상")
	case false:
		fmt.Println("0 미만")
	}

	// ex2)
	switch c := 10; c{
	case 10:
		fmt.Println(10)
	default:
		fmt.println(0)

	// 연산자를 이용해 계산된 값과 case 조건 비교 가능
	switch c := 10; c+5 {
	case 15: //c+5
		fmt.Println(c+5)
	default:
		fmt.Println(0)
	}

	//type을 이용한 분기
	switch y := 10.2; interface{}(y).(type){
	case int:
		fmt.Println("int")
	case string:
		fmt.Println("string")
	case float64:
		fmt.Println("float")
	default:
		fmt.Println("others")
	}
	
}

switch 문과 fallthrough

  • go는 case가 조건에 맞다면 컴파일러가 자동으로 break를 추가함)
  • break를 제외하고 싶을 때, fallthrough 사용
switch e := "go"; e {
	case "java":
		fmt.Println("java")
		fallthrough
	case "python":
		fmt.Println("python")
		fallthrough
	case "go":
		fmt.Println("go")
		fallthrough
		//fmt.Println("go2") // fallthrough 보다 뒤에 작성할 수 없음
	case "ruby":
		fmt.Println("ruby")
		fallthrough
	case "c":
		fmt.Println("c")
		//fallthrough // 마지막 case에 작성할 수 없음

	// 조건에 맞지 않기 때문에 "java", "python"은 지나침
	// 조건에 맞는 "go" case에 들어가 명령어 실행하고, fallthrough가 있기 때문에
	// 다음 case인 ruby로 가서 명령어를 실행
	// 마찬가지로 fallthrough가 있기 때문에 다음 케이스인 c로 가서 명령어를 실행