channel的聲明
建立有緩沖的管道
c := make(chan string,100)
建立無緩沖的管道
c := make(chan string)
往chan裡寫資料
for _,v := range words {
c <- v // 寫入chan
}
close(c)
從chan裡讀資料
for {
t, ok := <-in
if ok {
t = strings.ToLower(t)
words = append(words, t)
} else {
break
}
}
示例
import (
"strings"
"fmt"
)
//source 将輸入的words輸出到chan裡,chan長度由chanLen 指定
func source(words []string, chanLen int) <-chan string {
c := make(chan string,100)
for _,v := range words {
c <- v // 寫入chan
}
close(c)
return c
}
//lower word 将in中的word轉換成小寫輸出
func lower(in <-chan string) <-chan string {
var words []string
for {
t, ok := <-in
if ok {
t = strings.ToLower(t)
words = append(words, t)
} else {
break
}
}
c2 := make(chan string,100)
for _,v := range words {
fmt.Print(v+" ")
c2 <- v // 寫入chan
}
fmt.Println("lower end")
close(c2)
return c2
}
func ifContain(t string, filter[]string ) bool{
re := false
for _, v := range filter {
if strings.Contains(t,v) {
return true
}
}
return re
}
//filter 将in中word包含filter中單詞的輸出,注意隻要包含filter中某一項即輸出
func filter(filter[]string, in <-chan string) <-chan string {
var words []string
for {
t, ok := <-in
if ok {
//判斷是否含fiiter 若包含放在word中
if ifContain(t,filter) {
words = append(words,t)
}
} else {
break
}
}
c3 := make(chan string,100)
for _,v := range words {
fmt.Print(v+" ")
c3 <- v // 寫入chan
}
fmt.Println("fiter enbd")
close(c3)
return c3
}
//sink 将in中的word輸出到slice
func sink(in <-chan string) []string{
var words []string
for {
t, ok := <-in
if ok {
words = append(words,t)
} else {
break
}
}
for _,v := range words {
fmt.Print(v+" ")
}
fmt.Println("sink end")
return words
}