• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go语言之通道

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 func main() {
 8     //channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。
 9     //声明通道类型
10     var a chan int //声明一个int类型的通道 ,声明之后需要对它进行初始化
11     fmt.Println(a)
12     ch := make(chan int, 10) //进行初始化 有缓冲的通道
13     ch <- 10                 //将10发送到通道中
14     x := <-ch                //从通道中将10取出来赋值给x
15     fmt.Println(x)
16     close(ch) //关闭通道
17     //无缓冲通道
18     ch1 := make(chan int)
19     go recv(ch1)
20     ch1 <- 20
21 }
22 
23 func recv(c chan int) {
24     ret := <-c
25     fmt.Println(ret)
26 }

for range循环读取通道中的值:

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6 
 7     a := make(chan int)
 8     b := make(chan int)
 9     go func() {
10         for i := 0; i < 20; i++ {
11             a <- i
12         }
13         close(a)
14     }()
15     go func() {
16         for{
17             i,ok:=<-a
18             if !ok{
19                 break
20             }
21             b<-i
22         }
23         close(b)
24     }()
25 
26     for i:=range b{
27         fmt.Println(i)
28     }
29 }

单向通道:

  • chan<- int是一个只写单向通道(只能对其写入int类型值),可以对其执行发送操作但是不能执行接收操作;
  • <-chan int是一个只读单向通道(只能从其读取int类型值),可以对其执行接收操作但是不能执行发送操作。

在函数传参及任何赋值操作中可以将双向通道转换为单向通道,但反过来是不可以的。

select多路复用:


package main

import "fmt"

func main() {
ch := make(chan int, 1)
for i := 0; i < 10; i++ {
select {
case x := <-ch:
fmt.Println(x)
case ch <- i:
}
}
}

使用select语句能提高代码的可读性。

  • 可处理一个或多个channel的发送/接收操作。
  • 如果多个case同时满足,select会随机选择一个。
  • 对于没有caseselect{}会一直等待,可用于阻塞main函数。

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap