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 ...
随机推荐
- 两种获取MySql数据库中所有表的主键和外键约束信息的Sql语句
最近在写Rafy底层的一些东西,在数据库方面把MySql数据库集成到里面去,里面有一个需求,需要获取非系统数据库,也就是我们自己建立的数据库中所有表的主键和外键元数据列表. 第一种方法:是网上的方法, ...
- vue+node+mongoDB前后端分离个人博客(入门向)
最近学习了VUE,自己为了学习做了个小小的博客,功能很简单,不过开发过程中也遇到了很多坑,所以记录下来方便以后使用.欢迎大家交流学习. 功能 实现了用户注册.登录.token检测登录.用户留言.个人中 ...
- 大数据应用之HBase数据插入性能优化之多线程并行插入测试案例
一.引言: 上篇文章提起关于HBase插入性能优化设计到的五个参数,从参数配置的角度给大家提供了一个性能测试环境的实验代码.根据网友的反馈,基于单线程的模式实现的数据插入毕竟有限.通过个人实测,在我的 ...
- bzoj1193 马步距离
Description 求点(xs,ys)走马步到(xp,yp)的最小步数 Input 只包含4个整数,它们彼此用空格隔开,分别为xp,yp,xs,ys.并且它们的都小于10000000. Out ...
- appium+python自动化38-adb shell按键操作(input keyevent)
前言 接着上篇介绍input里面的按键操作keyevent事件,发送手机上常用的一些按键操作 keyevent 1.keyevent事件有一张对应的表,可以直接发送对应的数字,也可以方式字符串,如下两 ...
- R语言学习——欧拉计划(3)Largest prime factor 求最大质因数
The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 60085 ...
- python 可视化 二维坐标标注等等
基本画图操作: import matplotlib.pyplot as plt import numpy as np x = np.linspace(-3,3,50) y1 = 2*x+1 y2 = ...
- Redis:Redis
ylbtech-Redis:Redis 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回顶部 ...
- 1009 Product of Polynomials (25 分)
1009 Product of Polynomials (25 分) This time, you are supposed to find A×B where A and B are two pol ...
- Unreal Engine 4 笔记 2
转自:http://blog.csdn.net/st_dark/article/details/48005947 2.Actor继承自aactor,可以看成是一个容器,用来装"组件" ...