Blog

Go Tour-2

Go Tour

์Šฌ๋ผ์ด์Šค

โ€ข
์Šฌ๋ผ์ด์Šค๋Š” ๋ฐฐ์—ด์˜ ๊ฐ’์„ ๊ฐ€๋ฅดํ‚ค๋ฉฐ, []T ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
import "fmt" func main () { p := []int{1,2,3,4,5} fmt.Println(p) fmt.Println("p[0:3] == ", p[0:3]) fmt.Println("p[:3] == ", p[:3]) fmt.Println("p[2:] == ",p[2:]) }
Go
๋ณต์‚ฌ
โ€ข
make ํ•จ์ˆ˜๋กœ ์Šฌ๋ผ์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
โ€ข
len ๋Š” ์Šฌ๋ผ์ด์Šค ๊ธธ์ด, cap ๋Š” ์Šฌ๋ผ์ด์Šค์— ์ €์žฅ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
import "fmt" func main () { p := make([]int, 5) // len = 5, cap = 5 fmt.Println("p == ", p) fmt.Println("len(p) == ", len(p)) fmt.Println("cap(p) == ", cap(p)) q := make([]int, 0, 5) // len = 0, cap = 5 fmt.Println("q == ", q) fmt.Println("q[:cap(q)] == ", q[:cap(q)]) fmt.Println("q[1:] == ", q[1:]) var z []int // len = 0, cap = 0 fmt.Println("z == ", z) fmt.Println("len(z) == ", len(z)) fmt.Println("cap(z) == ", cap(z)) }
Go
๋ณต์‚ฌ
โ€ข
for ๋ฌธ์—์„œ range ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์Šฌ๋ผ์ด์Šค๋‚˜ ๋งต์„ ์ดํ„ฐ๋ ˆ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค
import "fmt" func main () { p := []int {2,4,6,8,10,12} for i, v := range p { fmt.Println("index == ", i) fmt.Println("value == ", value) } for i := range p { fmt.Println("index == ", i) } for _, v := range p { fmt.Println("value == ", v) } }
Go
๋ณต์‚ฌ

๋งต(Map)

โ€ข
Map ์€ ํ‚ค๋ฅผ ์ง€์ •ํ•˜์—ฌ ํ‚ค:๋ฒจ๋ฅ˜ ํ˜•ํƒœ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค
โ€ข
๋งต์€ ์‚ฌ์šฉํ•˜๊ธฐ์ „์— ๋ฐ˜๋“œ์‹œ make ๋ฅผ ๋ช…์‹œํ•ด์ค˜์•ผํ•œ๋‹ค.
type Vertax struct { Lat float64 Lng float64 } var m map[string]Vertax func main () { m = make(map[string]Vertax) m["Seoul"] = Vertax {37.541, 126.986} fmt.Println("m == ", m) fmt.Println("m['Seoul'] == ", m["Seoul"]) }
Go
๋ณต์‚ฌ
โ€ข
๋งŒ์•ฝ ๋งต์— ํ‚ค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ํƒ€์ž…์— ๋งž๋Š” zero value ๊ฐ€ ๋œ๋‹ค
โ€ข
delete(map, key) ๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค
import "fmt" type Vertax struct { Lat float64 Lng float64 } var m = map[string]Vertax { "Seoul": { 37.541, 126.986, }, "Busan": { 35.06, 129.0203, }, } func main () { fmt.Println(m) fmt.Println(m["Seoul"]) m["Seoul"] = Vertax{37.33, 126.5815} fmt.Println(m["Seoul"]) delete(m, "Seoul") fmt.Println(m) v, ok := m["Seoul"] fmt.Println(ok) fmt.Println(v) }
Go
๋ณต์‚ฌ

ํ•จ์ˆ˜

โ€ข
ํ•จ์ˆ˜๋„ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
import "fmt" func main () { hap := func(x int, y int) int { return x + y } fmt.Println(hap(1,2)) }
Go
๋ณต์‚ฌ
โ€ข
ํด๋กœ์ €
import "fmt" func adder () func(int) int { sum := 0 return func(x int) int { sum += x return sum } } func main () { a, b := adder(), adder() for i := 0; i < 10; i++ { fmt.Println( a(i + 1), b(i * 2), ) } }
Go
๋ณต์‚ฌ
โ€ข
A Tour of Go 44
import "fmt" // fibonacci is a function that returns // a function that returns an int. func fibonacci() func() int { i, j := 0, 1 return func () int { sum := i i, j = j, i + j return sum } } func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) } }
Go
๋ณต์‚ฌ

์Šค์œ„์น˜

โ€ข
๋‹ค๋ฅธ ์–ธ์–ด์™€ Switch ์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•˜์ง€๋งŒ, case๋ฌธ์˜ ์ฝ”๋“œ ์‹คํ–‰์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ break ํ•˜๋Š”๊ฒŒ ๋‹ค๋ฅด๋‹ค
โ€ข
์Šค์œ„์น˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ์ผ€์ด์Šค๋ฅผ ์ฐพ๋Š”๋‹ค
โ€ข
์Šค์œ„์น˜์—์„œ ์กฐ๊ฑด์„ ์ƒ๋žตํ•˜๋ฉด switch true ์™€ ๋™์ผํ•œ ์ˆ˜ํ–‰์„ ํ•œ๋‹ค
โ—ฆ
if-then-else ๊ฐ€ ๊ธธ์–ด์งˆ ๊ฒฝ์šฐ, ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค
import ( "fmt" "runtime" ) func main () { switch os := runtime.GOOS; os { case "darwin": fmt.Println("Mac OS") case "linux": fmt.Println("linux") default: fmt.Println(os) } }
Go
๋ณต์‚ฌ

๋ฉ”์†Œ๋“œ

โ€ข
๊ณ ์—๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†์ง€๋งŒ, ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌ์กฐ์ฒด์— ๋ถ™ํ˜€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
โ€ข
๊ตฌ์กฐ์ฒด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์–ด๋– ํ•œ ํƒ€์ž…์—๋„ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ถ™ํž ์ˆ˜ ์žˆ๋‹ค
โ—ฆ
๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์žˆ๋Š” ํƒ€์ž…์ด๋‚˜ ๊ธฐ๋ณธ ํƒ€์ž…์—๋Š” ๋ถ™ํž ์ˆ˜ ์—†๋‹ค
import "fmt" type Vertax struct { Lat, Lng float64 } func (v *Vertax) toString() string { return fmt.Sprintf("%f / %f", v.Lat, v.Lng) } func main () { v := Vertax{23, 25} fmt.Println(v.toString()) }
Go
๋ณต์‚ฌ

์ธํ„ฐํŽ˜์ด์Šค

import "fmt" type MyInterface interface { Abs() float64 } func main () { var a MyInterface v := Vertax{10, 15} a = v fmt.Println(a.Abs()) a = MyFloat(5) fmt.Println(a.Abs()) } type MyFloat float64 func (m MyFloat) Abs() float64 { if m < 0 { return float64(-m) } return float64(m) } type Vertax struct { X, Y float64 } func (v Vertax) Abs() float64 { return v.X + v.Y }
Go
๋ณต์‚ฌ

์—๋Ÿฌ

import ( "fmt" "time" ) type CustomError struct { When time.Time What string } func (e *CustomError) Error() string { return fmt.Sprintf("at %v, %s", e.When, e.What) } func run() error { return &CustomError{time.Now(), "Custom Error Test"} } func main () { err := run() if (err != nil) { fmt.Println(err) } }
Go
๋ณต์‚ฌ

๊ณ ๋ฃจํ‹ด๊ณผ ์ฑ„๋„

import "fmt" func fibonacci (n int, c chan int) { x, y := 0, 1 for i := 0; i < n; i++ { c <- x y, x = x, x + y } close(c) } func main () { c := make (chan int, 15) go fibonacci(cap(c), c) for r := range c { fmt.Println(r) } }
Go
๋ณต์‚ฌ
โ€ข
select ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋‹ค์ˆ˜์˜ ์ฑ„๋„๋กœ ๋ถ€ํ„ฐ ์ˆ˜์‹ ์„ ์ฑ„๋„๋ณ„๋กœ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋‹ค
import "fmt" func fibonacci (c, q chan int) { x, y := 0, 1 for { select { case c <- x: x, y = y, x + y case <- q: fmt.Println("quit") return } } } func main () { c := make(chan int, 10) q := make(chan int) go func() { for i := 0; i < cap(c); i++ { fmt.Println(<-c) } q <- 0 }() fibonacci(c, q) }
Go
๋ณต์‚ฌ
import ( "time" "fmt" ) func main () { tick := time.Tick(1000) boom := time.After(5000) for { select { case <- tick: fmt.Println("Tick!!") case <- boom: fmt.Println("Boom!!") return default: fmt.Println("...") time.Sleep(500) } } }
Go
๋ณต์‚ฌ