if 조건문 {
문장
} else if 조건문 {
문장
} else {
문장
}
if 초기문; 조건문 { 문장 }
if filename, success := UploadFile(); success {
fmt.Println("Upload success", filename)
} else {
fmt.Println("Failed to upload")
}
//filename, success는 if문 전체에서 사용 가능하다
switch 비굣값 {
case 값1:
문장
case 값2:
문장
default:
문장
}
switch day {
case "monday", "tuesday":
fmt.Println("월, 화요일은 수업 가는 날입니다.")
case "wednesday", "thursday", "friday":
fmt.Println("수, 목, 금요일은 실습 가는 날입니다.)
}
switch true {
case temp<10, temp>30:
fmt.Println("바깥 활동하기 좋은 날씨가 아닙니다.")
case temp>=10 && temp<20:
fmt.Println("약간 추울 수 있으니 가벼운 겉옷을 준비하세요.")
case temp>=15 && temp<25:
fmt.Println("야외 활동하기 좋은 날씨입니다.")
default:
fmt.Println("따뜻합니다.")
}
비굣값이 true가 되기 때문에 case(조건)의 결과가 true에 해당하는 경우 내부 문장을 실행한다.
switch 초기문; 비굣값 { case 값1: ... case 값2: ... default: ... }
func main() {
switch age := getMyAge(); age {
case 10:
fmt.Println("Teenage")
case 33:
fmt.Println("Pair 3")
default:
fmt.Println("My age is", age) //switch 내부에서 age변수 사용가능
}
fmt.Println("age is", age) //에러-switch문 밖에서는 age변수 사용불가
}
package main
import "fmt"
type ColorType int //별칭타입 - int형을 ColorType형이라고 부른다는 뜻
const (
Red ColorType = iota //0
Blue //1
Green //2
Yellow //3
)
func colorToString(color ColorType) string {
switch color {
case Red:
return "Red"
case Blue:
return "Blue"
case Green:
return "Green"
case Yellow:
return "Yellow"
default:
return "Undefined"
}
}
func getMyFavoriteColor() ColorType {
return Red
}
func main() {
fmtPrintln("My favorite color is", colorToString(getMyFavoriteColor()))
}
//My favorite color is Red
fallthrough : 다음 case문까지 이어서 실행한다는 뜻
func main() {
a := 3
switch a {
case 1:
fmt.Println("a==1")
case 2:
fmt.Println("a==2")
case 3:
fmt.Println("a==3")
fallthrough
case 4:
fmt.Println("a==4")
default:
fmt.Println("a != 1, 2, 3")
}
}
// a==3
// a==4
for 초기문; 조건문; 후처리 { //괄호를 사용하지 않아도 된다 코드블록 }
for ; 조건문; 후처리 { }
for 초기문; 조건문; { }
for ; 조건문; { }
or for 조건문 { }
for true { }
or for { }
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
stdin := bufio.NewReader(os.Stdin)
for {
fmt.Println("입력하세요")
var number int
_, err := fmt.Scanln(&number) //_:변수를 안쓰겠다는 의미
if err!= nil {
fmt.Println("숫자로 입력하세요")
//키보드 버퍼를 지우기
stdin.ReadString('\n') //변수로 받을 필요 없음
continue
}
fmt.Println("입력하신 숫자는 %d입니다.\n", number)
if number%2 == 0 { //짝수검사
break
}
}
fmt.Println("for문이 종료되었습니다.")
}
특정 조건일 때 for문을 종료하고 싶다면?
1. 플래그 변수 활용 (flag 변수)
2. 레이블 활용
func main() {
a := 1
b := 1
found := false
for ; a<=9; a++ {
for b = 1; b <= 9; b++ {
if a * b == 45 {
found = true
break
}
}
if found {
break
}
}
fmt.Println("%d * %d = %d\n", a, b, a*b)
}
// 5 * 9 = 45
플래그 변수를 사용하지 않고 break만 사용하면 break가 속한 하나의 for문(내부for문)에서만 벗어나게 된다.
중첩된 모든 for문에서 벗어나기 위해, break전에 플래그 변수를 true로 설정하여, 내부for문에서 벗어난 뒤 바깥 for문에서 바로 플래그 변수를 조건문으로 검사하여 한번더 break를 실행하여 모든 for문에서 빠져나갈 수 있다.
func main() {
a := 1
b := 1
OuterFor: //Label
for ; a<=9; a++ {
for b = 1; b <= 9; b++ {
if a * b == 45 {
break OuterFor
}
}
}
fmt.Println("%d * %d = %d\n", a, b, a*b)
}
OuterFor: // 레이블 명 지정
~
break OuterFor // 레이블이 첫번째로 만나는 for문까지 벗어나기