var c chan int // var 关键字声明,缓冲int类型数据 var c chan string // 缓冲string类型数据 c := make(chan int) // make关键字声明,非缓冲管道 c := make(chan int, 10) // 缓冲管道 type ChanInt chan int // 设置别名
// 先创建一个非缓冲管道 c := make(chan int) wg.Add(2) go func() { //子线程 for i := 0; i < 10; i++ { c <- i //写入数据 fmt.Println("写入数据") } wg.Done() }()
go func() { for i := 0; i < 10; i++ { a := <-c fmt.Println(a) //读取数据 fmt.Println("读取数据") } wg.Done() }()
wg.Wait()
}
=> 使用 channel 实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
package main
import "fmt"
func main() { c := make(chan int) go func() { for i:=10; i<10; i++ { fmt.Println("------") c <- i } close(c) }() for n := range c { fmt.Println("+++++") fmt.Println(n) } }
注:for n := range n 和 close(c) 配合使用,成对出现。for 循环会监视管道c,一旦管道中有数据,立即执行循环中的命令,取出值,直到 close(c) 命令关闭管道,循环结束