[Go] enum ์‚ฌ์šฉํ•˜๊ธฐ
ยท
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Go
๋“ค์–ด๊ฐ€๋ฉฐGo๋Š” ๊ณต์‹์ ์œผ๋กœ enum ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„๋กœ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์€ ์‰ฌ์šฐ๋‹ˆ ๋ช‡๊ฐœ ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ const + iota๋ฅผ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ ํƒ€์ž… ์ •์˜(type alias)๋กœ ์—ด๊ฑฐํ˜•๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ iota๋ฅผ ์ด์šฉํ•œ Enumpackage mainimport "fmt"// Weekday ํƒ€์ž… ์ •์˜type Weekday int// iota๋ฅผ ์ด์šฉํ•œ ์—ด๊ฑฐํ˜• ์ƒ์ˆ˜ ์„ ์–ธconst ( Sunday Weekday = iota Monday Tuesday Wednesday Thursday Friday Saturday)func main() { fmt.Println(Sunday, Monday, Tuesday) // 0 1 2 fm..
[Go] ์‹ค๋ฌด ํ™˜๊ฒฝ์—์„œ ๋กœ๊ทธ ์ œ๋Œ€๋กœ ๋‚จ๊ธฐ๊ธฐ(Logging)
ยท
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Go
๋“ค์–ด๊ฐ€๋ฉฐ24์‹œ๊ฐ„ ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜๋Š” ์‹ค๋ฌดํ™˜๊ฒฝ์—์„œ๋Š” ์–ธ์ œ ์–ด๋–ค ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ• ์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ด๋ฏธ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํƒœ์—์„œ ๊ธฐ์ˆ ์ž๋“ค์ด ์ œ์ผ ๋จผ์ € ํ™•์ธํ•˜๋Š” ๊ฒƒ๋“ค์€ "๋กœ๊ทธ"์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์‹œ์Šคํ…œ์—๋Š” ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ ๋กœ๊ทธ๋ฅผ ์ฐ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ ๋“ฑ ํ™˜๊ฒฝ์ด ๋ฐ”๋€Œ๋”๋ผ๋„ ๋ณด๊ธฐ ํŽธํ•˜๊ฒŒ ๋กœ๊ทธ ํ™˜๊ฒฝ ์„ค์ •๋ถ€ํ„ฐ ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. lorusgo์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ logํŒจํ‚ค์ง€๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ† ์ดํ”„๋กœ์ ํŠธ์—์„œ๋Š” logํŒจํ‚ค์ง€๋งŒ ์‚ฌ์šฉํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์‹ค๋ฌดํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธˆ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ํŒจํ‚ค์ง€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. logrus๋Š” go์˜ log ํŒจํ‚ค์ง€์™€ ํ˜ธํ™˜๋˜๋ฉด์„œ ์ƒ์œ„ ์ง‘ํ•ฉ์ฒด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(๊ณต์‹ ๋งํฌ)go get -u github.com/sirupsen/logrus์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ..
[Go] ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ์Šค์ผ€์ค„๋Ÿฌ ๋™์ž‘ํ•˜๊ธฐ(Ticker)
ยท
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Go
. time.Ticker ๋˜๋Š” time.AfterFunc, time.Sleep ๋“ฑ์„ ์ด์šฉํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์•„๋ž˜์—์„œ๋Š” ์‹ค๋ฌด์—์„œ ์ž์ฃผ ์“ฐ์ด๋Š” n์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐ˜๋ณต ์‹คํ–‰๋˜๋Š” ์ž‘์—… ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.๊ธฐ๋ณธ์ ์ธ time.Ticker ์‚ฌ์šฉ ์˜ˆ์‹œpackage mainimport ( "fmt" "time")func main() { ticker := time.NewTicker(5 * time.Second) // 5์ดˆ๋งˆ๋‹ค ๋ฐ˜๋ณต defer ticker.Stop() for { select { case t := ํ•ต์‹ฌ ํฌ์ธํŠธtime.NewTicker(d)๋Š” ์ผ์ • ์ฃผ๊ธฐ๋กœ ์ฑ„๋„์— ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.for + select ๊ตฌ๋ฌธ์œผ๋กœ ..
[Go] Map ์›๋ฆฌ์™€ ํ™œ์šฉ(feat. hash)
ยท
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Go
์†Œ๊ฐœGo์˜ map์€ ๋งค์šฐ ์ค‘์š”ํ•œ ๋‚ด์žฅ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, key-value ํ˜•ํƒœ์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”(hash table) ๊ธฐ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค.์›๋ฆฌ (๋‚ด๋ถ€ ๊ตฌ์กฐ)Go์˜ map์€ hash table์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.ํ•ต์‹ฌ ๊ฐœ๋…Key → Hashing → Bucket → Valueํ•ด์‹œ ํ•จ์ˆ˜(hash(key))๋ฅผ ํ†ตํ•ด ๋ฒ„ํ‚ท(bucket) ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๊ทธ ๋ฒ„ํ‚ท์— key-value ์Œ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ฐ™์€ ๋ฒ„ํ‚ท ์•ˆ์˜ ์Šฌ๋กฏ์— ์ฒด์ด๋‹(chaining) ํ˜•ํƒœ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.๋‚ด๋ถ€ ๊ตฌ์กฐ ๊ฐœ์š”Go ๋Ÿฐํƒ€์ž„์—์„œ map์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค (runtime/map.go ์ฐธ๊ณ ):type hmap struct { count int // ์š”์†Œ ๊ฐœ์ˆ˜ flags u..
[Go] ์Šฌ๋ผ์ด์Šค(slice)์—๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋‹ค
ยท
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Go
์‹œ์ž‘์Šฌ๋ผ์ด์Šค๋Š” Go์—์„œ ๊ฐ€๋ณ€๊ธธ์ด ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๊ณ ์ •๊ธธ์ด ๋ฐฐ์—ด์€ var arr [10]int ์ด์ง€๋งŒ ์Šฌ๋ผ์ด์Šค๋Š” var slice []int์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์Šฌ๋ผ์ด์Šค๋Š” ๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.package mainimport "fmt"func main() { var slice []int if len(slice) == 0 { // โถ slice ๊ธธ์ด๊ฐ€ 0์ธ์ง€ ํ™•์ธ fmt.Println("slice is empty", slice) } slice[1] = 10 // โท ์—๋Ÿฌ ๋ฐœ์ƒ fmt.Println(slice)} ์ดˆ๊ธฐํ™”[] ์ด์šฉvar slice1 = []int{1, 2, 3}var slice2 = []int{1, 5:2, 10:3} // [1 0 0 0 0 2 0 0 0 0 3] //์ธ๋ฑ์Šค 5๋Š” 2, 10์€ 3make() ..
[Go] Gin ํ”„๋ ˆ์ž„์›Œํฌ
ยท
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Go
๋“ค์–ด๊ฐ€๋ฉฐGin์€ Go ์–ธ์–ด ๊ธฐ๋ฐ˜์˜ ๊ณ ์„ฑ๋Šฅ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋ณ๊ณ  ์œ ์—ฐํ•˜๋ฉฐ ๋ฏธ๋“ค์›จ์–ด, ๋ผ์šฐํŒ…, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํžˆ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ง• → ์žฅ๋‹จ์  → ์‹ค๋ฌด ์‚ฌ์šฉ ์˜ˆ์ œ → ์šด์˜ ํŒ ์ˆœ์„œ๋กœ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 1) ๊ฐœ์š”Gin์€ Go๋กœ ์ž‘์„ฑ๋œ ๊ฒฝ๋Ÿ‰(ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ ํ’๋ถ€) ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์ƒ์‚ฐ์„ฑ(๊ฐ„๋‹จํ•œ API)๊ณผ ์„ฑ๋Šฅ(๋น ๋ฅธ ๋ผ์šฐํŒ…)์„ ๋™์‹œ์— ๋…ธ๋ฆฌ๋Š” ์„œ๋น„์Šค์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. (Gin Web Framework)์ฃผ ์‚ฌ์šฉ ์‚ฌ๋ก€: REST API, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค, ๋‚ด๋ถ€ ํˆด/๊ด€๋ฆฌ ์ฝ˜์†” ๋“ฑ — JSON ๋ฐ”์ธ๋”ฉ๊ณผ ๋ฏธ๋“ค์›จ์–ด ์กฐํ•ฉ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ณ  ์šด์˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. (Gin Web Framework)2) ์ฃผ์š” ํŠน์ง•๋น ๋ฅธ ๋ผ์šฐํ„ฐ(Zero-allocation / radix tree..