go语言channel的别样用法
1.返回值使用通道
func main() {
// 生成随机数作为一个服务
randService := randGenerator()
// 从服务中读取随机数并打印
fmt.Printf("%d\n",<-randService)
}
func randGenerator() chan int {
// 创建通道
out := make(chan int)
// 创建协程
go func() {
for {
//向通道内写入数据,如果无人读取会等待
out <- rand.Int()
}
}()
return out
}
2.参数使用通道
//一个查询结构体
type query struct {
//参数Channel
sql chan string
//结果Channel
result chan string
}
//执行Query
func execQuery(q query) {
//启动协程
go func() {
//获取输入
sql := <-q.sql
//访问数据库,输出结果通道
q.result <- "get" + sql
}()
}
func main() {
//初始化Query
q := query{make(chan string, ),make(chan string, )}
//执行Query,注意执行的时候无需准备参数
execQuery(q)
//准备参数
q.sql <- "select * from table"
//获取结果
fmt.Println(<-q.result)
}
3.并发循环
func doSomething(num int) (sum int) {
for i := ; i <= ; i++ {
fmt.Printf("%d + %d = %d\n", num, num + i, num + num + i)
sum = sum + num + i
}
return sum
}
func testLoop() {
// 建立计数器,通道大小为cpu核数
var NumCPU = runtime.NumCPU()
fmt.Printf("NumCPU = %d\n", NumCPU)
sem :=make(chan int, NumCPU);
//FOR循环体
data := []int{, , , , , , , , , }
for _,v:= range data {
//建立协程
go func (v int) {
fmt.Printf("doSomething(%d)...\n", v)
sum := doSomething(v);
//计数
sem <- sum;
} (v);
}
// 等待循环结束
var total int =
for i := ; i < len(data); i++ {
temp := <- sem
fmt.Printf("%d <- sem\n", temp)
total = total + temp
}
fmt.Printf("total = %d\n", total)
}
func main() {
testLoop()
}
4.利用channel计算素数
// Send the sequence 2, 3, 4, ... to channel 'in'.
func Generate(ch chan int) {
for i := ; ; i++ {
ch<- i // Send 'i' to channel 'in'.
}
}
// Copy the values from channel 'in' to channel 'out',
// removing those divisible by 'prime'.
func Filter(in chan int, out chan int, prime int) {
for {
i := <-in // Receive valuefrom 'in'.
if i%prime != {
out <- i // Send'i' to 'out'.
}
}
}
func main() {
in := make(chan int)
go Generate(in) // Launch Generate goroutine.
for i := ; i < ; i++ {
prime := <-in
print(prime, "\n")
out := make(chan int)
go Filter(in, out, prime)
in = out
}
}
5.共享变量的读写
//共享变量有一个读通道和一个写通道组成
type shardedVar struct {
reader chan int
writer chan int
}
//共享变量维护协程
func whachdog(v shardedVar) {
go func() {
//初始值
var value int =
for {
//监听读写通道,完成服务
select {
case value = <-v.writer:
case v.reader <-value:
}
}
}()
}
func main() {
//初始化,并开始维护协程
v := shardedVar{make(chan int), make(chan int)}
whachdog(v)
//读取初始值
fmt.Println(<-v.reader)
//写入一个值
v.writer <-
//读取新写入的值
fmt.Println(<-v.reader)
}
还可以访问我树莓派上搭的博客地址:
go语言channel的别样用法的更多相关文章
- C语言函数sscanf()的用法
从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( st ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- JAVA语言中冒号的用法
近来由于本人要介入android平台的开发,所以就买了本JAVA语言的书学习.学习一段时间来,我的感觉是谭浩强就是厉害,编写的<C编程语言>系列丛书不愧是经典.书中对C语言的介绍既系统又全 ...
- Unity 3D开发-C#脚本语言的一些基础用法
Unity 中C#语言的一些基础用法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lerp -- 线 ...
- C语言函数sscanf()的用法(转)
转自:http://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html C语言函数sscanf()的用法 sscanf() - 从一个字符串中 ...
- C语言函数sscanf()的用法-从字符串中读取与指定格式相符的数据(转)
C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var ...
- GO语言延迟函数defer用法分析
这篇文章主要介绍了GO语言延迟函数defer用法,较为详细的分析了GO语言的特性与具体用法,并给出了一个比较典型的应用实例,具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例讲述了GO语言延迟 ...
- C语言函数sscanf()的用法-(转自Walter L)
在我的学习过程中,从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int ss ...
- 解决全局变量共享---C语言的extern关键字用法
在调试程序时,有一个参数需要在多个函数之间传递,因为是作为调试参数,不想将参数引入到函数中. 很自然的想到使用全局变量来表示这个公共参数,工程代码的结构如下: main.c test.c test.h ...
随机推荐
- arcgis license manager 10.2服务无法启动
(步骤)1. 用cmd切换到 license manager 安装目录,如 C:\Program Files (x86)\ArcGIS\License10.2\bin,输入: Lmgrd -z -c ...
- Qt常用类及类方法简介之 QAction类
1.QAction::QAction ( const QString & text, QObject * parent ) QAction类的构造函数之一,利用text,parent创建 ...
- selenium APi
1.查看浏览器的名字方法:name实例:drvier.name 2.删除浏览器所以的cookies方法:delete_all_cookies()实例:driver.delete_all_cookies ...
- spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情
<spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...
- [转]Windows服务“允许服务与桌面交互”的使用和修改方法
上一篇文章是纯 C# 代码的形式勾上 “允许服务与桌面交互” 选项的 本文转载自:http://blog.csdn.net/lanruoshui/article/details/4756408 描述: ...
- 1109 Group Photo (25 分)
1109 Group Photo (25 分) Formation is very important when taking a group photo. Given the rules of fo ...
- 1027 Colors in Mars (20 分)
1027 Colors in Mars (20 分) People in Mars represent the colors in their computers in a similar way a ...
- Maven报错找不到jre
常规配置maven环境变量,报错: The JAVA_HOME environment variable is not defined correctly. This environment vari ...
- Linux命令详解-Apache网站服务器配置和管理
1.Apache网站服务器配置和管理 1.源码包安装 2.rpm包安装 rpm –a | grep httpd 3.启动服务 service httpd start 4.配置文件: /etc/http ...
- Java 运算符-=,+=混合计算详解
+=与-=运算符混合计算解析: int x = 3; x += x -= x -= x += x -= x; 详解:算数运算按运算符优先级运算,从右至左计算. 1. x=x-x; 实际为 3 - 3 ...