제어문 - 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로 가서 명령어를 실행