조건, 반복, 분기문에 대해 알아본다. Java 나 C/C++ 대비 다른 부분만 설명하도록 하겠다. 일반적인 부분은 느낌대로 쓰면 된다. 뭔가 잘못되면 문법 오류가 바로 뜰테니 몇번 만나면 익숙해진다.
▌if
if <조건> { 처럼 사용, 중괄호 “{“ 가 반드시 inline 으로 와야한다. 중괄호를 생략해도 에러난다.
조건문에는 괄호 () 가 오지 않는다.
if err != nil {
utils.Fatalf("Unlock error: %v", err)
}
utils.Fatalf("Unlock error: %v", err)
}
if 의 block 이 끝나는 중괄호와 같은 라인에 else { 가 와야 한다
if script := ctx.GlobalString(utils.ExecFlag.Name); script != "" {
repl.batch(script)
} else {
repl.welcome()
repl.interactive()
}
repl.batch(script)
} else {
repl.welcome()
repl.interactive()
}
} else if <조건> { 과 같이 else if 문도 inline 이어야 한다
if entry := GetHeader(db, header.Hash()); entry == nil {
t.Fatalf("Stored header not found")
} else if entry.Hash() != header.Hash() {
t.Fatalf("Retrieved header mismatch: have %v, want %v", entry, header)
}
t.Fatalf("Stored header not found")
} else if entry.Hash() != header.Hash() {
t.Fatalf("Retrieved header mismatch: have %v, want %v", entry, header)
}
if <조건문> 내에서 함수 실행. 세미콜론 ; 으로 구분하여 if 구문 안에서 하고자 하는 작업을 선행할 수 있다.
if b, err := ioutil.ReadFile("./hello.txt"); err == nil {
fmt.Printf("%s", b)
}
fmt.Printf("%s", b)
}
위에서 ioutil 패키지는 []byte, error 를 동시리턴하도록 되어있다. 나중에 다룰 내용이지만 이 동시리턴 된 값중 error 값을 조사하여 error 가 있으면 if block 을 실행하는 예제이다.
위에서 if 조건문에서 사용한 b, err 변수는 if 문 바깥에서는 사용할 수 없다
▌for
Go 에는 do…while 이나 while 이 없고 for 반복문만 제공됨
if 문 처럼 for <조건문> 에서도 괄호 () 를 사용하지 않으며 { 는 inline 으로 붙어야 함
for 문에 <조건문> 을 주지 않으면 무한루프를 돈다
func main() {
for {
fmt.Println("무한 루프")
}
}
for {
fmt.Println("무한 루프")
}
}
▌루프 Label 과 break, continue
Go 에서는 break 와 continue 시에 Loop Label 을 지원함
Label 은 for 문 바로 윗줄에 쓰여야 함
func main() {
OutterLoop:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i == 2 && j == 2 {
break OutterLoop
} else if j == 3 {
continue OutterLoop
}
fmt.Println(i, j)
}
}
}
OutterLoop:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i == 2 && j == 2 {
break OutterLoop
} else if j == 3 {
continue OutterLoop
}
fmt.Println(i, j)
}
}
}
결과
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
▌switch
Go 의 switch 문에서는 switch / case 만 쓰면 되며, 매 case 마다 break 를 사용할 필요가 없다.
조건에 만족하지 않으면 default: 라벨로 간다
case 에 “문자열” 을 쓸 수 있다.
func main() {
str := "굿준"
switch str {
case "굿준":
fmt.Println(str, "'s Blog")
default:
fmt.Println("DEFAULT")
}
}
str := "굿준"
switch str {
case "굿준":
fmt.Println(str, "'s Blog")
default:
fmt.Println("DEFAULT")
}
}
그러나 여전히 break 문을 case 를 빠져나오기 위해 사용할 수 있다. (if 문 안에서..)
case 안에서 fallthrough 키워드를 사용하면 java 나 C/C++ 에서 break 문이 없는것과 같이 다음 case 로 넘어가는 효과를 낼 수 있다
func main() {
str := "굿준"
switch str {
case "굿준":
fmt.Print(str)
fallthrough // 다음 case 로 흘러간다
case "블로그":
fmt.Println("'s 블로그")
default:
fmt.Println("DEFAULT")
}
}
str := "굿준"
switch str {
case "굿준":
fmt.Print(str)
fallthrough // 다음 case 로 흘러간다
case "블로그":
fmt.Println("'s 블로그")
default:
fmt.Println("DEFAULT")
}
}
결과
굿준's 블로그
case 안에서 여러 조건을 함께 처리할 수 있다. case 의 값을 콤마 , 로 분리하면 된다.
func main() {
str := "굿준"
switch str {
case "굿준", "개발자":
fmt.Print(str)
fallthrough // 다음 case 로 흘러간다
case "블로그", "트위터", "페이스북":
fmt.Println("'s 블로그")
default:
fmt.Println("DEFAULT")
}
}
str := "굿준"
switch str {
case "굿준", "개발자":
fmt.Print(str)
fallthrough // 다음 case 로 흘러간다
case "블로그", "트위터", "페이스북":
fmt.Println("'s 블로그")
default:
fmt.Println("DEFAULT")
}
}
switch 안에서 조건식도 사용 가능하다. 조건문 안에서 함수를 호출하고 case 로 분기하는 예제이다.
이때 조건문 안에서의 함수호출 다음에는 반드시 세미콜론 ; 이 와야한다.
func main() {
val1 := 100
rand.Seed(time.Now().UnixNano())
switch swVal := val1 + rand.Intn(10); { // 조건문 안에서의 함수호출은 ; 필수!
case swVal > 100 && swVal < 200:
fmt.Println("100 보다 크고 200보다 작음")
case swVal >= 200 :
fmt.Println("200 보다 크거나 같음")
fallthrough
default:
fmt.Println("많이 큼")
}
}
val1 := 100
rand.Seed(time.Now().UnixNano())
switch swVal := val1 + rand.Intn(10); { // 조건문 안에서의 함수호출은 ; 필수!
case swVal > 100 && swVal < 200:
fmt.Println("100 보다 크고 200보다 작음")
case swVal >= 200 :
fmt.Println("200 보다 크거나 같음")
fallthrough
default:
fmt.Println("많이 큼")
}
}
그리고, 함수가 호출된 경우에는 case 문의 값은 <조건식> 만 가능하다.
반응형
'Software Development > Go (golang)' 카테고리의 다른 글
3.3 Go - Package (0) | 2016.03.01 |
---|---|
3.2 Go - 기본 문법 및 Type (0) | 2016.02.29 |
3.1 Go - Hello World (0) | 2016.02.29 |
2. Go - 개발환경 구성 (0) | 2016.02.28 |
1.3 Go 언어란? - 다른 언어와 비교 (0) | 2016.02.28 |