For
For문 구조
for 초기화 구문; 조건 표현; 사후 구문 {
continue
}
- 초기화 구문 : 첫 번째 반복 전에 수행된다.
- 조건 표현 : 매번 모든 반복 이전에 판별된다.
- 사후 구문 : 매번 반복 마지막에 수행된다.
For
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
result
45
- Go는 for 반복문 단 하나의 반복 구조를 가진다.
- 기본적인 for 반복문의 ; 로 구별되는 세 가지 구성 요소를 가진다.
- Go는 for 문의 세 가지 구성 요소를 감싸는 괄호가 없으며 { } 괄호가 항상 필수이다.
- 반복문은 조건 판별의 boolean 값이 false 이면 반복을 종료한다.
- 초기화 구문은 주로 짧은 변수 선언이며, 선언된 변수들은 for문의 스코프 내에서만 보여진다.
이어서
package main
import "fmt"
func main() {
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
}
result
1024
- 초기화 구문과 사후 구문이 필수는 아니다.
- 위와같이 생략이 가능하다는 관점에서 C의 while은 Go에서 for로 사용할 수 있다.
for에서 무한루프
package main
func main() {
for {
}
}
result
timeout running program
Program exited: status 1.
- 반복 조건을 생략하면 간단하게 무한 루프를 만들 수 있다.
if
package main
import (
"fmt"
"math"
)
func sqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}
func main() {
fmt.Println(sqrt(2), sqrt(-4))
}
result
1.4142135623730951 2i
- Go의 if문은 for반복문과 비슷하다.
if와 else
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
} else {
fmt.Printf("%g >= %g\\n", v, lim)
}
// can't use v here, though
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}
result
27 >= 20
9 20
- if문 안에서 선언된 변수들은 어떠한 else 블럭에서 사용 가능하다.
Switch
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Print("Go runs on ")
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.\\n", os)
}
}
result
Go runs on Linux.
- switch 구문은 연속적인 if-else 구문을 사용하는 짧은 방안이다.
- 값이 조건문과 같은 첫 번째 case를 실행한다.
- 각각의 case안에 자동으로 break가 제공된다.
- switch case는 상수일 필요가 없으며, 그 값은 정수일 필요도 없다.
조건이 없는 Switch
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.")
}
}
result
Good evening.
- 조건이 없는 Switch는 switch ture와 동일하다.
- 이 구조는 긴 if-else 체인을 작성하는데 있어 깔끔한 방식일 수 있다.
defer
package main
import "fmt"
func main() {
defer fmt.Println("world")
fmt.Println("hello")
}
result
hello
world
- defer문은 자신을 둘러싼 함수가 종료할 때까지 실행을 연기한다.
defer 스택 쌓기
package main
import "fmt"
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}
result
counting
done
9
8
7
6
5
4
3
2
1
0
- 연기된 함수 호출은 스택에 쌓이고, 함수가 종료될 때 연기된 함수들은 후입선출 순서로 수행된다.
'프로그래밍' 카테고리의 다른 글
[Gotour] 기초 - 더 많은 타입들: struct와 slice, map (0) | 2023.05.25 |
---|---|
[Gotour] 기초 - 패키지와 변수 함수 (0) | 2023.05.19 |