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