入門Goプログラミング(SHOEISHA) の Lesson31 の "Pipeline1.go"のコメントによる私の為の解説
package main
import (
"fmt"
"strings"
)
func main() {
c0 := make(chan string) // makeってなんだ? →"配列"でも"共有メモリ"でもいいが、
c1 := make(chan string) // 江端理解では「トンネル」とか「パイプ」とか「Amazonのダンボール箱」
go sourceGopher(c0) // "c0"とラベルの付いたダンボール箱を使うぜ
go filterGopher(c0, c1) // "c0","c1"とラベルの付いたダンボール箱を使うぜ
printGopher(c1) // "c1"とラベルの付いたダンボール箱を使うぜ
}
func sourceGopher(downstream chan string) {
for _, v := range []string{"hello world", "a bad apple", "goodbye all"} {
downstream <- v // "c0"のダンボール箱に、(1)"hello world",(2)"a bad apple", (3)"goodbye all"を投げ入れる
}
downstream <- "" // "c0"のダンボール箱の底にクッション(プチプチ)を入れる
}
func filterGopher(upstream, downstream chan string) {
for {
item := <-upstream // "c0"のダンボール箱からクッションを取り出す
if item == "" { // クッションだったら
downstream <- "" // "c1"のダンボール箱にクッションを入れる
return // ダンボール箱の蓋を閉める
}
if !strings.Contains(item, "bad") { // "bad"という文字列が入っていない荷物だったら
downstream <- item // "c1"のダンボール箱に荷物を入れる
}
}
}
func printGopher(upstream chan string) {
for {
v := <-upstream // "c1"のダンボール箱から荷物を出す
if v == "" { // "c1"の荷物がクッションだったら
return // ダンボール箱を閉める
}
fmt.Println(v) // 荷物を読み上げる
}
}