[Go] Concurrency: return channel

๋งŒ์•ฝ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ, ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๋ถ€๋ชจ ๊ณ ๋ฃจํ‹ด์ด ์ข…๋ฃŒ์‹œ์ ์„ ์•Œ์•„์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๊ฒ ๋Š”๊ฐ€?

์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” idiom์€ ์ด๋Ÿฌํ•˜๋‹ค.

๋ฆฌํ„ด๊ฐ’์„ ์ฑ„๋„๋กœ ๊ฐ์‹ธ์„œ ์ƒ์„ฑํ•ด๋†“๊ณ , ๊ทธ ๋‚ด๋ถ€์—์„œ ๊ณ ๋ฃจํ‹ด์„ ๋Œ๋ฆฐ ๋‹ค์Œ ๊ทธ ์ฑ„๋„๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ณ ๋ฃจํ‹ด์ด ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋ฉด ํ•ด๋‹น ์ฑ„๋„์— ๊ฒฐ๊ณผ๊ฐ’์„ ๋ณด๋‚ด์ค€๋‹ค.

์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋กœ ๋””์ž์ธ์„ ํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ธก๋ฉด์—์„œ ์ข€ ๋” ๊ทธ๋Ÿด๋“ฏํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฐ์‹์œผ๋กœ ๋ง์ด๋‹ค.

๊ฐ’์ด ํ•„์š”ํ•œ ์‹œ์ ์— <- ํ‘œํ˜„์œผ๋กœ ๋ธ”๋Ÿญ์„ ๊ฑธ๊ณ  ๊ฐ’์„ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋Ÿฌ๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์—์„œ ํ”ํžˆ ์ œ๊ณตํ•˜๋Š” async/await๊ณผ ๊ฑฐ์˜ ์œ ์‚ฌํ•œ API๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ทธ๋ ‡๋‹ค.

์ „์ฒด ์ฝ”๋“œ

package main

import (
	"fmt"
	"os"
)

func ReadFileAsync(filename string) chan string {
	result := make(chan string)

	go func() {
		if data, err := os.ReadFile(filename); err == nil {
			result <- string(data)
		} else {
			panic(err)
		}
	}()

	return result
}

func main() {
	result := <-ReadFileAsync("test.txt")
	fmt.Println(result)
}