programming language/Go

[Go] go-tour _ flowcontrol

moaoh 2021. 9. 25. 17:24

ํ•ด๋‹น๊ธ€์€ ์•„๋ž˜ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ๋“ค์„ ์ •๋ฆฌํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.

 

Go๋ฅผ ํ–ฅํ•œ ์—ฌํ–‰

 

go-tour-ko.appspot.com


for

package main

import "fmt"

func main() {
	sum := 0
	for i := 0; i < 10; i++ {
		sum += i
	}
	fmt.Println(sum)
}

๋ฐ˜๋ณต๋ฌธ์ด ๋Œ์•„๊ฐ€๋ฉฐ "์•ˆ๋…•?" ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅ

๊ด„ํ˜ธ๊ฐ€ ์—†๋Š” c๋А๋‚Œ

๋ฌธ๋ฒ•์ด ์ƒ๋‹นํžˆ c๋ž‘ ์œ ์‚ฌํ•ด์„œ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฑฐ๊ฐ™๋‹ค.


For continued

package main

import "fmt"

func main() {
	sum := 1
	for ; sum < 1000; {
		sum += sum
	}
	fmt.Println(sum)
}

sum์„ ๋ฐฐ์ˆ˜๋กœ ๊ณ„์† ๋”ํ•œ ๊ฐ’์„ ์ถœ๋ ฅ

for๋ฌธ์—์„œ ์ดˆ๊ธฐํ™”๊ตฌ๋ถ„๊ณผ ์ฆ๊ฐ? ๊ตฌ๋ฌธ์€ ํ•„์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.

์œ„์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


For is Go's "while"

package main

import "fmt"

func main() {
	sum := 1
	for sum < 1000 {
		sum += sum
	}
	fmt.Println(sum)
}

while๋ฌธ ์ฒ˜๋Ÿผ sum์˜ ๋ฐฐ์ˆ˜๋ฅผ ๊ณ„์† ๋”ํ•จ

for๋ฌธ์—์„œ ; ์„ ์ƒ๋žตํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด

while๋ฌธ ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋ญ”๊ฐ€ ๋˜๊ฒŒ ๋Šฅ๋™์ ์ด๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

์“ธ๋ฐ์—†๋Š” ๊ฒƒ๋“ค์„ ๋œ์–ด๋‚ธ ๋А๋‚Œ?


Forever

package main

func main() {
	for {
	}
}

๋ฌดํ•œ ๋ฃจํ”„

for๋ฌธ์—์„œ ์กฐ๊ฑด์„ ์ƒ๊ฐํ•˜๋ฉด ๋ฌดํ•œ ๋ฃจํ”„์˜ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


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))
}

๊ฐ’์— ๋”ฐ๋ผ ์‹ค์ˆ˜ ์ œ๊ณฑ๊ทผ ๋˜๋Š” ๋ณต์†Œ์ˆ˜์˜ ์ œ๊ณฑ๊ทผ ์ถœ๋ ฅ

if๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ c์–ธ์–ด์™€ ๋‹ค๋ฅด์ง€์•Š์•˜๋‹ค.

๊ด„ํ˜ธ๊ฐ€ ์—†๋Š”์ •๋„..?

	if x < 0
		return sqrt(-x) + "i"

๋‹ค๋งŒ ์ด๋Ÿฌํ•œ ํ˜•์‹์œผ๋กœ ์ ๋Š”๋‹ค๋˜๊ฐ€? ์ €๋Ÿฐ ๋ฐฉ๋ฒ•์€ ๋ถˆ๊ฐ€๋Šฅ {}์ด ํ•„์ˆ˜๋กœ ์žˆ์–ด์•ผํ•œ๋‹ค.


If with a short statement

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๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ ์งง์„ ๊ตฌ๋ฌธ์„ ๋„ฃ์–ด์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๋” ์ค„์ผ ์ˆ˜ ์žˆ๋Š”๋ฐฉ๋ฒ•?

  • ํฐ ์ˆ˜๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋ฐ˜ํ™˜

 

์†”์งํžˆ ์ด๊ฑฐ๋Š” ์™œ ํ•„์š”ํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค..

์—†์–ด๋„ ๋ ๊ฑฐ๊ฐ™๊ณ  ์žˆ์–ด๋„ ๋ ๊ฑฐ๊ฐ™์€๋ฐ..


If and 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),
	)
}

์ œ๊ณฑ๊ทผ์ด ๋” ํฐ๋‹ค๋ฉด ์ด์œ ๋ฅผ ๋ฐ˜ํ™˜

if else ๋ฌธ์˜ ์‚ฌ์šฉ ์˜ˆ์ œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œ์‹œ

if๋ฌธ์—์„œ ์‚ฌ์šฉํ•˜์˜€๋˜ ์งง์€ ๊ตฌ๋ฌธ์€ else๋ฌธ์—์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ


Exercise: Loops and Functions

package main

import (
	"fmt"
	"math"
)

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))
	fmt.Println(math.Sqrt(2))
}

๊ณ„์‚ฐํ•œ ๊ฐ’๊ณผ ์‹ค์ œ ๊ฐ’ ์ถœ๋ ฅ

๋ฐ˜๋ณต๋ฌธ๊ณผ ํ•จ์ˆ˜๋ฅผ ์‹ค์ œ๋กœ ๋Œ€์ž…ํ•˜์—ฌ ์‚ฌ์šฉํ•ด๋ด๋ผ๋ผ๋Š” ๋ฌธ์ œ

์ œ๊ณฑ๊ทผ ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ.

์ˆ˜ํ•™์ด ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค..


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)
	}
}

ํ˜„์žฌ ์šด์˜์ฒด์ œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

switch ์‚ฌ์šฉ๋ฐฉ๋ฒ•

os ์— ํ˜„์ œ ์šด์˜์ฒด์ œ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  switch๋ฅผ ํ†ตํ•ด์„œ ์šด์˜์ฒด์ œ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ํ˜„์žฌ ์šด์˜์ฒด์ œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

switch๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€์•Š์•„์„œ ๋ชฐ๋ž์—ˆ๋Š”๋ฐ

go์—์„œ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ switch์— ์†๋„๊ฐ€ ๋น ๋ฅธํŽธ์ด๋ผ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ ํ•œ๋‹ค.

์ต์ˆ™ํ•ด์ง€๋Š”๊ฒŒ ์ข‹์„๊ฑฐ๊ฐ™๋‹ค.


Switch evaluation order

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("When's Saturday?")
	today := time.Now().Weekday()
	fmt.Println(today)
	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.")
	}
}

ํ˜„์žฌ ๋‚ ์”จ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ถœ๋ ฅ

switch๋ฌธ์— ๊ฒฝ์šฐ์—๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ์ง„ํ–‰์ด ๋œ๋‹ค.

case์— ํ•ด๋‹นํ•˜๋Š” ๋‚ด์šฉ์ด ๋˜์–ด ์•ˆ์— ๋“ค์–ด๊ฐ€๋ฉด ์•„๋ž˜ ๋‚ด์šฉ๋“ค์€ ์ง„ํ–‰ํ•˜์ง€์•Š์Œ

 


Switch with no condition

package main

import (
	"fmt"
	"time"
)

func main() {
	t := time.Now()
	fmt.Println(t.Hour())
	switch {
	case t.Hour() < 12:
		fmt.Println("Good morning!")
	case t.Hour() < 17:
		fmt.Println("Good afternoon.")
	default:
		fmt.Println("Good evening.")
	}
}

ํ˜„์žฌ ์‹œ๊ฐ„์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์˜ค์ „์ธ์ง€ ์˜คํ›„์ธ์ง€ ์ถœ๋ ฅ

์•„๋ฌด ๊ฐ’๋„ ๋„ฃ์ง€์•Š์œผ๋ฉด switch trueํ˜•์‹์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

๊ทธ๋ƒฅ switch๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ธ ๊ฑฐ ๊ฐ™๋‹ค.


Defer

package main

import "fmt"

func main() {
	defer fmt.Println("world")

	fmt.Println("hello")
}

์ถœ๋ ฅ ๊ฐ’๋“ค์„ ์ถœ๋ ฅํ•œ๋‹ค

defer๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์—ฐ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์†Œ๋ฉธ์ž์™€ ๋น„์Šทํ•œ ๋А๋‚Œ?


Stacking defers

package main

import "fmt"

func main() {
	fmt.Println("counting")

	for i := 0; i < 10; i++ {
		defer fmt.Println(i)
	}

	fmt.Println("done")
}

defer ์ž์ฒด๋Š” ํ›„์ž…์„ ์ถœ์„ ์›์น™์œผ๋กœ ํ•˜๊ธฐ๋•Œ๋ฌธ์— ์Šคํƒ ํ˜•์‹์œผ๋กœ ์ง„ํ–‰์ด๋œ๋‹ค.

๋‚˜์ค‘์— ์ถœ๋ ฅํ•œ ๋ฌธ์ž๊ฐ€ ๋งˆ์ง€๋ง‰์— ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹