channel
569 字
3 分钟
channel
channel
channel
func main() { // 定义一个channel c := make(chan int)
go func() { defer fmt.Println("goroutine end")
fmt.Println("goroutine running...") c <- 666 // 将 666 发送给c }()
// 读取到 666 num := <-c // 从channel c中接收数据( <-c ),并赋值给num fmt.Println("num=", num) fmt.Println("main goruntine end")}----------------goroutine running...goroutine endnum= 666main goruntine end如果main中不从channel获取的话,goroutine end 无法输出
有缓存和无缓存
- 当channel已满,继续向里写数据,会阻塞
- 当channel为空,从里面取数据,也会阻塞
func main() { c := make(chan int, 3) // channel,带有3个缓存位 fmt.Printf("len(c)=%v, cap(c)=%v\n", len(c), cap(c)) go func() { defer fmt.Println("子go程结束") // 0-2,顺序给chan for i := 0; i < cap(c)+2; i++ { c <- i fmt.Println("子go程发送元素=", i+1, "len=", len(c), "cap=", cap(c)) } }()
time.Sleep(2 * time.Second) for i := 0; i < cap(c); i++ { num := <-c fmt.Println("num=", num) } time.Sleep(2 * time.Second) fmt.Println("main 结束")}---------------len(c)=0, cap(c)=3子go程发送元素= 1 len= 1 cap= 3子go程发送元素= 2 len= 2 cap= 3子go程发送元素= 3 len= 3 cap= 3num= 0num= 1num= 2子go程发送元素= 4 len= 3 cap= 3子go程发送元素= 5 len= 2 cap= 3子go程结束main 结束channel和range
func main() { c := make(chan int) go func() { for i := 0; i < 5; i++ { c <- i } // close channel close(c) }()
/*for { if data, ok := <-c; ok { fmt.Println("data=", data) } else { break } }*/ // 使用range迭代来操作channel for data := range c { fmt.Println("data=", data) } fmt.Println("done")}-----------data= 0data= 1data= 2data= 3data= 4donechannel和select
func fibonacii(c, quit chan int) { // 简写形式,都是chan int x, y := 1, 1 for { select { case c <- x: // x传给channel c // 如果c可写,则选case就会进来 x = y y = x + y fmt.Println("x=", x, "y=", y) case <-quit: // 从channel quit单纯取值,不使用 fmt.Println("quit") return } }}func main() { c := make(chan int) quit := make(chan int)
// sub go fmt.Println("sub go start") go func() { fmt.Println("sub go func start") for i := 0; i < 6; i++ { fmt.Println("sub go", <-c) } quit <- 0 fmt.Println("sub go func end") }() fmt.Println("sub go end")
// main go fmt.Println("main go start") fibonacii(c, quit) fmt.Println("main go end")}---------------sub go startsub go endmain go startsub go func startsub go 1x= 1 y= 2x= 2 y= 4sub go 1sub go 2x= 4 y= 8x= 8 y= 16sub go 4sub go 8x= 16 y= 32x= 32 y= 64sub go 16sub go func endquitmain go end文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章 智能推荐
1
1 变量和常量
golang 1 变量和常量
2
2 输入输出
golang 2 输入输出
3
3 基本数据类型
golang 3 基本数据类型
4
4 数组、切片和Map
golang 4 数组、切片和Map
5
5 判断
golang 5 判断
随机文章 随机推荐