2023๋…„ 6์›” 13์ผยท3๋ถ„ ์ฝ๊ธฐ

Go์˜ ๋™์‹œ์„ฑ

Go ๋™์‹œ์„ฑ ๋ชจ๋ธ์˜ ํž˜์„ ์‚ดํŽด๋ณด๊ณ  ํšจ๊ณผ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด์„ ๋ฐฐ์šฐ๊ณ  ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ํ™” ๊ธฐ์ˆ ์„ ์•Œ์•„๋ณด์„ธ์š”.

Go์˜ ๋™์‹œ์„ฑ

Go์˜ ๋™์‹œ์„ฑ ์†Œ๊ฐœ

๋™์‹œ์„ฑ์€ ๋™์‹œ ๋˜๋Š” ์˜์‚ฌ ๋ณ‘๋ ฌ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ์‹คํ–‰๋˜๋Š” ๋…๋ฆฝ์ ์ธ ์ž‘์—…์˜ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ€ํ‹ฐ์ฝ”์–ด ํ”„๋กœ์„ธ์„œ์˜ ์ž ์žฌ๋ ฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ณ  ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ณต์žกํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋””์ž์ธ์„ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ตœ์‹  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ์ ์ธ ์ธก๋ฉด์ž…๋‹ˆ๋‹ค.

golang ์ด๋ผ๊ณ ๋„ ํ•˜๋Š” Go๋Š” ๋‹จ์ˆœ์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋œ ์ •์  ์œ ํ˜•์˜ ์ปดํŒŒ์ผ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ ๋ชจ๋ธ์€ Tony Hoare์˜ CSP(Communicating Sequential Processes) ์—์„œ ์˜๊ฐ์„ ์–ป์—ˆ์œผ๋ฉฐ ์ด๋Š” ๋ช…์‹œ์  ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ์ฑ„๋„๋กœ ์ƒํ˜ธ ์—ฐ๊ฒฐ๋œ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์„ธ์Šค์˜ ์ƒ์„ฑ์„ ์ด‰์ง„ํ•˜๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค. Go์˜ ๋™์‹œ์„ฑ์€ ๊ณ ๋ฃจํ‹ด, ์ฑ„๋„ ๋ฐ 'select' ๋ฌธ์˜ ๊ฐœ๋…์„ ์ค‘์‹ฌ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ž‘์—… ๊ฐ„ ์•ˆ์ „ํ•˜๊ณ  ์ •ํ™•ํ•œ ํ†ต์‹  ๋ฐ ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•˜๋ฉด์„œ ์‰ฝ๊ณ  ์ตœ์†Œํ•œ์˜ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋กœ ๊ณ ๋„์˜ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AppMaster ์—์„œ ๊ฐœ๋ฐœ์ž๋Š” Go์˜ ๋™์‹œ์„ฑ ๋ชจ๋ธ์„ ํ™œ์šฉํ•˜์—ฌ ์‹œ๊ฐ์  ์ฒญ์‚ฌ์ง„ ๋””์ž์ด๋„ˆ์™€ ์ž๋™ ์†Œ์Šค ์ฝ”๋“œ ์ƒ์„ฑ์„ ํ†ตํ•ด ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ณ ์„ฑ๋Šฅ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๋ฃจํ‹ด: ๋™์‹œ์„ฑ์˜ ๋นŒ๋”ฉ ๋ธ”๋ก

Go์—์„œ ๋™์‹œ์„ฑ์€ Go ๋Ÿฐํƒ€์ž„ ์Šค์ผ€์ค„๋Ÿฌ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ€๋ฒผ์šด ์Šค๋ ˆ๋“œ์™€ ๊ฐ™์€ ๊ตฌ์กฐ์ธ ๊ณ ๋ฃจํ‹ด์˜ ๊ฐœ๋…์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค. ๊ณ ๋ฃจํ‹ด์€ OS ์Šค๋ ˆ๋“œ์— ๋น„ํ•ด ๋งค์šฐ ์ €๋ ดํ•˜๋ฉฐ ๊ฐœ๋ฐœ์ž๋Š” ๊ณผ๋„ํ•œ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ์—†์ด ๋‹จ์ผ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ˆ˜์ฒœ ๋˜๋Š” ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ฃจํ‹ด์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹จ์ˆœํžˆ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์•ž์— 'go' ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์‹œ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ๋™์‹œ์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 func printMessage(message string) { fmt.Println(message) } func main() { go printMessage("Hello, concurrency!") fmt.Println("This might print first.") }

์ธ์‡„๋œ ๋ฉ”์‹œ์ง€์˜ ์ˆœ์„œ๋Š” ๊ฒฐ์ •์ ์ด์ง€ ์•Š์œผ๋ฉฐ ๋‘ ๋ฒˆ์งธ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ฉ”์‹œ์ง€๋ณด๋‹ค ๋จผ์ € ์ธ์‡„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ณ ๋ฃจํ‹ด์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ๋™์‹œ์— ์‹คํ–‰๋˜๋ฉฐ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Go ๋Ÿฐํƒ€์ž„ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๊ณ ๋ฃจํ‹ด์„ ๊ด€๋ฆฌ ๋ฐ ์‹คํ–‰ํ•˜์—ฌ CPU ์‚ฌ์šฉ๋ฅ ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์ปจํ…์ŠคํŠธ ์ „ํ™˜์„ ํ”ผํ•˜๋ฉด์„œ ๋™์‹œ์— ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. Go์˜ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ž‘์—… ๋„์šฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ ๋ฃจํ‹ด์„ ํ˜‘๋ ฅ์ ์œผ๋กœ ์˜ˆ์•ฝํ•˜์—ฌ ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—… ์ค‘์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์ ์ ˆํ•  ๋•Œ ์ œ์–ด๊ถŒ์„ ์–‘๋ณดํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ฃจํ‹ด์€ ํšจ์œจ์ ์ด์ง€๋งŒ ๋ถ€์ฃผ์˜ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ๋ฆฌ์†Œ์Šค ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๊ณ ๋ฃจํ‹ด์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ฃผ์–ด์ง„ ์‹œ๊ฐ„์— ํ™œ์„ฑ ๊ณ ๋ฃจํ‹ด์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—…์ž ํ’€๊ณผ ๊ฐ™์€ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฑ„๋„: ๊ณ ๋ฃจํ‹ด ๊ฐ„ ๋™๊ธฐํ™” ๋ฐ ํ†ต์‹ 

์ฑ„๋„์€ ๊ณ ๋ฃจํ‹ด์ด ์‹คํ–‰์„ ์•ˆ์ „ํ•˜๊ฒŒ ํ†ต์‹ ํ•˜๊ณ  ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” Go ๋™์‹œ์„ฑ ๋ชจ๋ธ์˜ ๊ธฐ๋ณธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ฑ„๋„์€ Go์˜ ์ผ๋ฅ˜ ๊ฐ’์ด๋ฉฐ 'make' ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์šฉ๋Ÿ‰์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์„ ํƒ์  ๋ฒ„ํผ ํฌ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 // Unbuffered channel ch := make(chan int) // Buffered channel with a capacity of 5 bufCh := make(chan int, 5)

์ง€์ •๋œ ์šฉ๋Ÿ‰์˜ ๋ฒ„ํผ๋ง๋œ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ฑ„๋„์— ์ €์žฅํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋Œ€๊ธฐ์—ด ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋Š˜๋ฆฌ๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋Š” ๊ต์ฐฉ ์ƒํƒœ๋‚˜ ๊ธฐํƒ€ ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฑ„๋„์„ ํ†ตํ•œ ๊ฐ’ ์ „์†ก์€ '<-' ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

 // Sending the value 42 through the channel ch <- 42 // Sending values in a for loop for i := 0; i < 10; i++ { ch <- i }

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฑ„๋„์—์„œ ๊ฐ’์„ ์ˆ˜์‹ ํ•  ๋•Œ๋„ ๋™์ผํ•œ '<-' ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ฑ„๋„์ด ์˜ค๋ฅธ์ชฝ์— ์žˆ์Šต๋‹ˆ๋‹ค.

 // Receiving a value from the channel value := <-ch // Receiving values in a for loop for i := 0; i < 10; i++ { value := <-ch fmt.Println(value) }

์ฑ„๋„์€ ๊ณ ๋ฃจํ‹ด ํ†ต์‹  ๋ฐ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์˜ ์ผ๋ฐ˜์ ์ธ ํ•จ์ •์„ ํ”ผํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๊ฒฝํ•ฉ ๋ฐ ๊ธฐํƒ€ ๋™์‹œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‘ ๊ฐœ์˜ ๋™์‹œ ํ•จ์ˆ˜๊ฐ€ ๋‘ ์กฐ๊ฐ์˜ ์š”์†Œ๋ฅผ ํ•ฉ์‚ฐํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ  ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋Š” ๋‹ค์Œ ์˜ˆ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

 func sumSlice(slice []int, result *int) { sum := 0 for _, value := range slice { sum += value } *result = sum } func main() { slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{6, 7, 8, 9, 10} sharedResult := 0 go sumSlice(slice1, &sharedResult) go sumSlice(slice2, &sharedResult) time.Sleep(1 * time.Second) fmt.Println("Result:", sharedResult) }

์œ„์˜ ์˜ˆ๋Š” ๋‘ ๊ณ ๋ฃจํ‹ด์ด ๋™์ผํ•œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๊ฒฝ์Ÿ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋ฉด ํ†ต์‹ ์„ ์•ˆ์ „ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กญ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 func sumSlice(slice []int, ch chan int) { sum := 0 for _, value := range slice { sum += value } ch <- sum } func main() { slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{6, 7, 8, 9, 10} ch := make(chan int) go sumSlice(slice1, ch) go sumSlice(slice2, ch) result1 := <-ch result2 := <-ch fmt.Println("Result:", result1 + result2) }

Go์˜ ๋‚ด์žฅ๋œ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ฃจํ‹ด๊ณผ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ณ  ์šฐ์•„ํ•œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ตœ์‹  ํ•˜๋“œ์›จ์–ด์˜ ์ž ์žฌ๋ ฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AppMaster ์—์„œ Go ์–ธ์–ด๋Š” ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ์œ„ํ•œ ์ž๋™ ์†Œ์Šค ์ฝ”๋“œ ์ƒ์„ฑ์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹œ๊ฐ์ ์œผ๋กœ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Go์˜ ์ผ๋ฐ˜์ ์ธ ๋™์‹œ์„ฑ ํŒจํ„ด

ํŒŒ์ดํ”„๋ผ์ธ ์›Œํฌํ”Œ๋กœ ๊ตฌ์ถ•
๊ฐ ๋‹จ๊ณ„๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋งคํ•‘ํ•˜๊ณ  Go ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
์›Œํฌํ”Œ๋กœ ๊ตฌ์ถ•

๋™์‹œ์„ฑ ํŒจํ„ด์€ ๋™์‹œ์„ฑ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ํ•˜๋Š” ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์ด ์„น์…˜์—์„œ๋Š” ํŒฌ์ธ/ํŒฌ์•„์›ƒ, ์ž‘์—…์ž ํ’€, ํŒŒ์ดํ”„๋ผ์ธ ๋“ฑ Go์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋™์‹œ์„ฑ ํŒจํ„ด์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŒฌ์ธ/ํŒฌ์•„์›ƒ

ํŒฌ์ธ/ํŒฌ์•„์›ƒ ํŒจํ„ด์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ์ž‘์—…(ํŒฌ์•„์›ƒ)๊ณผ ํ•ด๋‹น ์ž‘์—…์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ๋‹จ์ผ ์ž‘์—…(ํŒฌ์ธ)์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Go์—์„œ๋Š” ๊ณ ๋ฃจํ‹ด๊ณผ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Fan-out ๋ถ€๋ถ„์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ณ ๋ฃจํ‹ด์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ƒ์„ฑ๋˜๋ฉฐ, Fan-in ๋ถ€๋ถ„์€ ๋‹จ์ผ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ```go func FanIn(channels ...<-chan int) <-chan int { var wg sync.WaitGroup out := make(chan int) wg.Add(len(channels)) for _, c := range channels { go func(ch <-chan int) { for n := range ch { out <- n } wg.Done() }(c) } go func() { wg.Wait() close(out) }( ) ๋ฐ˜ํ™˜ } ```

์ž‘์—…์ž ํ’€

์ž‘์—…์ž ํ’€์€ ๋™์ผํ•œ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ์ผ๋ จ์˜ ๊ณ ๋ฃจํ‹ด์œผ๋กœ ์ž‘์—… ๋ถ€ํ•˜๋ฅผ ์„œ๋กœ ๋ถ„์‚ฐ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์€ ๋™์‹œ์„ฑ์„ ์ œํ•œํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๊ณ ๋ฃจํ‹ด์˜ ์ˆ˜๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Go์—์„œ๋Š” ๊ณ ๋ฃจํ‹ด, ์ฑ„๋„ ๋ฐ 'range' ํ‚ค์›Œ๋“œ์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์ž ํ’€์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```go func WorkerPool(workers int, jobs <-chan Job, results chan<- Result) { for i := 0; i < ๋…ธ๋™์ž; i++ { go func() { for job := range jobs { results <- job.Execute() } }() } } ```

ํŒŒ์ดํ”„๋ผ์ธ

ํŒŒ์ดํ”„๋ผ์ธ ํŒจํ„ด์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ผ๋ จ์˜ ์ž‘์—…์œผ๋กœ, ๊ฐ ์ž‘์—…์€ ์ถœ๋ ฅ์„ ๋‹ค์Œ ์ž‘์—…์— ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Go์—์„œ ํŒŒ์ดํ”„๋ผ์ธ ํŒจํ„ด์€ ๊ณ ๋ฃจํ‹ด ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ผ๋ จ์˜ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•˜๋‚˜์˜ ๊ณ ๋ฃจํ‹ด์€ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‹จ๊ณ„ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ```go func Pipeline(input <-chan Data) <-chan Result { stage1 := stage1(input) stage2 := stage2(stage1) return stage3(stage2) } ```

์†๋„ ์ œํ•œ

์†๋„ ์ œํ•œ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋น„ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์†๋„๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹œ์Šคํ…œ ๊ณผ๋ถ€ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go์—์„œ๋Š” time.Ticker ๋ฐ 'select' ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์†๋„ ์ œํ•œ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```go func RateLimiter(requests <-chan Request, rate time.Duration) <-chan Response { limit := time.NewTicker(rate) responses := make(chan Response) go func() { defer close(responses) for req := ๋ฒ”์œ„ ์š”์ฒญ { <-limit.C ์‘๋‹ต <- req.Process() } }() ๋ฐ˜ํ™˜ ์‘๋‹ต } ```

์ทจ์†Œ ๋ฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ ํŒจํ„ด

๋™์‹œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž‘์—…์„ ์ทจ์†Œํ•˜๊ฑฐ๋‚˜ ์ž‘์—… ์™„๋ฃŒ๋ฅผ ์œ„ํ•œ ์ œํ•œ ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜๋ ค๋Š” ์ƒํ™ฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go๋Š” ๊ณ ๋ฃจํ‹ด์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํ…์ŠคํŠธ ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ทจ์†Œ, ๊ธฐํ•œ ์„ค์ • ๋˜๋Š” ๊ฒฉ๋ฆฌ๋œ ํ˜ธ์ถœ ๊ฒฝ๋กœ์—์„œ ๊ณต์œ ํ•  ๊ฐ’์„ ์ฒจ๋ถ€ํ•˜๋ผ๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```go func WithTimeout(ctx context.Context, duration time.Duration, task func() error) error { ctx, cancel := context.WithTimeout(ctx, duration) defer cancel() done := make(chan error, 1) go func() { done <- task() }() select { case <-ctx.Done(): return ctx.Err() case err := <-done: return err } } ```

๋™์‹œ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ณต๊ตฌ

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ณต๊ตฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ƒํ™ฉ์— ๋Œ€์‘ํ•˜๊ณ  ์ œ์–ด๋œ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•๋ ฅํ•œ ๋™์‹œ ํ”„๋กœ๊ทธ๋žจ์˜ ํ•„์ˆ˜ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด ์„น์…˜์—์„œ๋Š” ๋™์‹œ Go ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ณ ๋ฃจํ‹ด์˜ ํŒจ๋‹‰์—์„œ ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋™์‹œ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

  1. ์ฑ„๋„์„ ํ†ตํ•ด ์˜ค๋ฅ˜ ๋ณด๋‚ด๊ธฐ : ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๋ฃจํ‹ด ๊ฐ„์— ์˜ค๋ฅ˜ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ  ์ˆ˜์‹ ์ž๊ฐ€ ๊ทธ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```go func worker(jobs <-chan int, results chan<- int, errs chan<- error) { for job := range jobs { res, err := process(job) if err != nil { errs < - ์˜ค๋ฅ˜ ๊ณ„์† } ๊ฒฐ๊ณผ <- ์ž…์ˆ  } } ```
  2. 'select'๋ฌธ ์‚ฌ์šฉ : ๋ฐ์ดํ„ฐ์™€ ์˜ค๋ฅ˜ ์ฑ„๋„์„ ๊ฒฐํ•ฉํ•  ๋•Œ 'select'๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ฑ„๋„์„ ๋“ฃ๊ณ  ์ˆ˜์‹ ๋œ ๊ฐ’์— ๋”ฐ๋ผ ์กฐ์น˜๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```go select { case res := <-results: fmt.Println("Result:", res) case err := <-errs: fmt.Println("Error:", err) } ```

๊ณ ๋ฃจํ‹ด ํŒจ๋‹‰์—์„œ ํšŒ๋ณตํ•˜๊ธฐ

๊ณ ๋ฃจํ‹ด์˜ ํŒจ๋‹‰์—์„œ ๋ณต๊ตฌํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ง€์ • ๋ณต๊ตฌ ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ 'defer' ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๊ณ ๋ฃจํ‹ด์ด ํŒจ๋‹‰์— ์ง๋ฉดํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋ฉฐ ์˜ค๋ฅ˜๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ธฐ๋กํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```go func workerSafe() { defer func() { if r := ๋ณต๊ตฌ(); r != nil { fmt.Println("Recovered from:", r) } }() // ์—ฌ๊ธฐ์— ๊ณ ๋ฃจํ‹ด ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. } ```

์„ฑ๋Šฅ์„ ์œ„ํ•œ ๋™์‹œ์„ฑ ์ตœ์ ํ™”

๊ธฐ์ˆ  ๋ถ€์ฑ„ ์—†๋Š” ํ”„๋กœํ† ํƒ€์ž…
๋ณ€๊ฒฝ ํ›„ ์žฌ์ƒ์„ฑํ•ด ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”.
ํ”„๋กœํ† ํƒ€์ž… ์‹œ์ž‘

Go์—์„œ ๋™์‹œ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋ ค๋ฉด ์ฃผ๋กœ ๋ฆฌ์†Œ์Šค ํ™œ์šฉ์˜ ์ ์ ˆํ•œ ๊ท ํ˜•์„ ์ฐพ๊ณ  ํ•˜๋“œ์›จ์–ด ๊ธฐ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋™์‹œ Go ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

  • ๊ณ ๋ฃจํ‹ด ์ˆ˜ ๋ฏธ์„ธ ์กฐ์ • : ์ ์ ˆํ•œ ๊ณ ๋ฃจํ‹ด ์ˆ˜๋Š” ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ํ•˜๋“œ์›จ์–ด ์ œํ•œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๊ฐ’์œผ๋กœ ์‹คํ—˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋งž๋Š” ์ตœ์ ์˜ ๊ณ ๋ฃจํ‹ด ์ˆ˜๋ฅผ ์ฐพ์œผ์„ธ์š”.
  • ๋ฒ„ํผ๋ง๋œ ์ฑ„๋„ ์‚ฌ์šฉ : ๋ฒ„ํผ๋ง๋œ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋ฉด ๋™์‹œ ์ž‘์—…์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋™๊ธฐํ™”๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์‚ฐํ•˜๊ณ  ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์†๋„ ์ œํ•œ ๊ตฌํ˜„ : ๋ฆฌ์†Œ์Šค ์ง‘์•ฝ์ ์ธ ํ”„๋กœ์„ธ์Šค์—์„œ ์†๋„ ์ œํ•œ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ œ์–ดํ•˜๊ณ  ๊ฒฝํ•ฉ, ๊ต์ฐฉ ์ƒํƒœ ๋ฐ ์‹œ์Šคํ…œ ๊ณผ๋ถ€ํ•˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์บ์‹ฑ ์‚ฌ์šฉ : ์ž์ฃผ ์•ก์„ธ์Šค๋˜๋Š” ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜์—ฌ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ์ค„์ด๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํŒŒ์ผ๋ง : pprof์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœํŒŒ์ผ๋งํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ๊ณผ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ ์ž‘์—…์„ ์‹๋ณ„ํ•˜๊ณ  ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— AppMaster ํ™œ์šฉ : AppMaster ๋…ธ์ฝ”๋“œ ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜๋ฉด Go์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์ตœ์ ์˜ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋™์‹œ์„ฑ ํŒจํ„ด๊ณผ ์ตœ์ ํ™” ๊ธฐ์ˆ ์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด Go์—์„œ ํšจ์œจ์ ์ด๊ณ  ๊ณ ์„ฑ๋Šฅ์˜ ๋™์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ•๋ ฅํ•œ AppMaster ํ”Œ๋žซํผ๊ณผ ํ•จ๊ป˜ Go์˜ ๋‚ด์žฅ๋œ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒˆ๋กœ์šด ์ฐจ์›์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ์‹ญ์‹œ์˜ค.

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

Go์—์„œ ๋™์‹œ์„ฑ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

Go์—์„œ์˜ ๋™์‹œ์„ฑ์€ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Go๋Š” ๊ณ ๋ฃจํ‹ด, ์ฑ„๋„ ๋ฐ 'select' ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์‹œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Go์˜ ๊ณ ๋ฃจํ‹ด์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๊ณ ๋ฃจํ‹ด์€ Go์˜ ๋Ÿฐํƒ€์ž„ ์‹œ์Šคํ…œ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€๋ฒผ์šด ์Šค๋ ˆ๋“œ์™€ ๊ฐ™์€ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ˆ˜์ฒœ ๋˜๋Š” ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ๋™์‹œ ์ž‘์—…์„ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์‰ฝ๊ณ  ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๋ฃจํ‹ด์€ 'go' ํ‚ค์›Œ๋“œ์™€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. Go ๋Ÿฐํƒ€์ž„ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๊ณ ๋ฃจํ‹ด์„ ๋™์‹œ์— ๊ด€๋ฆฌํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฑ„๋„์€ ๋™์‹œ์„ฑ์—์„œ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋‚˜์š”?

Go์˜ ์ฑ„๋„์€ ๊ณ ๋ฃจํ‹ด ๊ฐ„์˜ ๋™๊ธฐํ™” ๋ฐ ํ†ต์‹ ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋™์‹œ ์ž‘์—… ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์—ฌ ํ†ต์‹ ์ด ์•ˆ์ „ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๊ฒฝํ•ฉ์ด ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ฑ„๋„์€ ์ƒ์„ฑ ์ค‘์— ์ง€์ •ํ•œ ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ๋ฒ„ํผ๋ง๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฒ„ํผ๋ง๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go์˜ ์ผ๋ฐ˜์ ์ธ ๋™์‹œ์„ฑ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

Go์˜ ์ผ๋ฐ˜์ ์ธ ๋™์‹œ์„ฑ ํŒจํ„ด์—๋Š” ํŒฌ์ธ/ํŒฌ์•„์›ƒ ํŒจํ„ด, ์ž‘์—…์ž ํ’€, ํŒŒ์ดํ”„๋ผ์ธ, ์†๋„ ์ œํ•œ ๋ฐ ์ทจ์†Œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒจํ„ด์„ ๊ฒฐํ•ฉํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜์—ฌ Go์—์„œ ๊ฐ•๋ ฅํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋™์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์‹œ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ํŒจ๋‹‰์—์„œ ๋ณต๊ตฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?

Go์—์„œ๋Š” ์ฑ„๋„์„ ํ†ตํ•ด ์˜ค๋ฅ˜ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ , 'select' ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜ ์†Œ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ณต๊ตฌ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ 'defer' ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๋ฃจํ‹ด์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํŒจ๋‹‰์„ ๊ฐ€๋กœ์ฑ„๊ณ  ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ๋™์‹œ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

Go์—์„œ ๋™์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์ตœ์ ํ™” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

Go์—์„œ ๋™์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด ๊ณ ๋ฃจํ‹ด ์ˆ˜๋ฅผ ๋ฏธ์„ธ ์กฐ์ •ํ•˜๊ณ , ๋ฒ„ํผ๋ง๋œ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋Š˜๋ฆฌ๊ณ , ์†๋„ ์ œํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ œ์–ดํ•˜๊ณ , ์บ์‹ฑ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ์ค„์ด๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœํŒŒ์ผ๋งํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•˜๊ณ  ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ AppMaster ์‚ฌ์šฉํ•˜์—ฌ Go์˜ ๋™์‹œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‰ฌ์šด ์‹œ์ž‘
๋ฉ‹์ง„๋งŒ๋“ค๊ธฐ

๋ฌด๋ฃŒ ์š”๊ธˆ์ œ๋กœ AppMaster๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
์ค€๋น„๊ฐ€ ๋˜๋ฉด ์ ์ ˆํ•œ ๊ตฌ๋…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๋‹ค
Go์˜ ๋™์‹œ์„ฑ | AppMaster