치춘짱베리굿나이스
[Go] 02 흐름제어 구문 본문
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
fmt.Println("Love everyone <3")
sum += i
}
fmt.Println(sum)
}
- <3 :fingerheart:
- 괄호없는 C for구문 같다
package main
import "fmt"
func main() {
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
}
- for문의 좌우 구문 (초기화 구문과 i++ 구문) 은 필수가 아니다
package main
import "fmt"
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}
- 내친구 while이~~~!!!!
- 앞뒤 구문을 생략해도 되기 때문에, for문을 while문처럼 사용할 수 있다
package main
func main() {
for {
}
}
- 모든 구문을 생략하면 무한루프로 사용할 수 있다
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))
}
- 조건문은 괄호를 생략한 C와 같다
- 해당 함수는 값이 음수인가 아닌가에 따라 실수 제곱근 또는 복소수 제곱근을 출력
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
}
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}
- if 조건문을 진입하기 직전에 실행시킬 짧은 구문을 넣을 수 있다 (v < lim 직전 세미콜론)
- 이때 선언된 변수 v는 if문의 끝까지만 스코프가 존재한다 (if문 밖에서 사용하면 오류남
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),
)
}
- C나 기타 언어들과 마찬가지로 else문 사용이 가능하며, 위의 조건문 직전에 실행시켰던 구문 (짧은 구문) 에서 선언한 변수는 else가 끝날 때까지 사용할 수 있다
package main
import (
"fmt"
)
func Sqrt(x float64) float64 {
z := 1.0
for i := 0; i < 10; i++ {
z -= (z * z - x) / (2 * z)
}
return z
}
func main() {
fmt.Println(Sqrt(2))
}
- 제곱근을 구하는 함수는 반복문 내에서 어떠한 수식을 돌려서 근사값을 구한다고 한다
- 어렵다!!!!!
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)
}
}
- 현재 내 os 환경이 OS X라서 OS X으로 출력이 되었다
- 원격 Go 여행 서버로 구동시키면 Linux가 나온다
- Switch / Case 문은 C와 상당히 유사하나, break 없이도 한 구문만을 실행시킨다
- if문과 마찬가지로 switch case 스코프 내에서만 유효한 짧은 구문을 조건문 직전에 사용할 수 있다
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("When's Saturday?")
today := time.Now().Weekday()
switch time.Saturday {
case today + 0:
fmt.Println("Today.")
case today + 1:
fmt.Println("Tomorrow.")
case today + 2:
fmt.Println("In two days.")
default:
fmt.Println("Too far away.")
}
}
- time.Now().Weekday() 는 요일을 받아오고, 거기서 수를 더하는 식으로 다른 요일을 탐색할 수 있는 것 같다
- 동작시켜 보면 다른 부분은 출력되지 않고 케이스에 해당하는 부분만 출력되는 것을 볼 수 있다
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.")
}
}
- switch 부분에 아무 조건도 적지 않는 것은 곧 switch 1을 의미한다
- case에 다른 조건을 넣어줌으로써 if-else문과 같은 구성을 만들 수 있음
- default 부분이 else가 되고, 각각의 case가 if - else if가 되겠지요?
package main
import "fmt"
func main() {
defer fmt.Println("나이스")
fmt.Println("치춘짱")
}
- defer 문에 붙어있는 "나이스" 는 func main() 의 호출이 끝날 때까지 대기하고 호출된다
- defer문은 자신을 둘러싼 함수 (여기서는 main()) 가 종료될 때까지 함수 실행을 연기
package main
import "fmt"
func main() {
fmt.Println("함수의 시작이야")
for i := 0; i < 10; i++ {
defer fmt.Println("치춘짱 나이스 *", i)
}
fmt.Println("함수의 끝이고")
}
- main 함수의 시작점 진입
- defer i = 0부터 i = 9까지 스택에 쌓임 (후입선출 = LIFO)
- main 함수의 끝점에 도달하고 함수 종료
- 스택에 쌓인 함수들이 순서대로 (후입선출이므로 9부터 1까지) 호출
'기타공부 > Go를 향한 여행' 카테고리의 다른 글
[Go] 03 더 많은 타입들 (0) | 2021.09.23 |
---|---|
[Go] 01 패키지와 변수 함수 (2) | 2021.09.19 |
[Go] 00 환영합니다 (3) | 2021.09.18 |
Comments