天天看點

channel的用法

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
}