치춘짱베리굿나이스

[Go] 02 흐름제어 구문 본문

기타공부/Go를 향한 여행

[Go] 02 흐름제어 구문

치춘 2021. 9. 19. 19:04
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("함수의 끝이고")
}

  1. main 함수의 시작점 진입
  2. defer i = 0부터 i = 9까지 스택에 쌓임 (후입선출 = LIFO)
  3. main 함수의 끝점에 도달하고 함수 종료 
  4. 스택에 쌓인 함수들이 순서대로 (후입선출이므로 9부터 1까지) 호출

 

'기타공부 > Go를 향한 여행' 카테고리의 다른 글

[Go] 03 더 많은 타입들  (0) 2021.09.23
[Go] 01 패키지와 변수 함수  (2) 2021.09.19
[Go] 00 환영합니다  (3) 2021.09.18
Comments