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)
}
 

还可以访问我树莓派上搭的博客地址:

http://www.codeforfun.info/

 

go语言channel的别样用法的更多相关文章

  1. C语言函数sscanf()的用法

    从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( st ...

  2. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  3. JAVA语言中冒号的用法

    近来由于本人要介入android平台的开发,所以就买了本JAVA语言的书学习.学习一段时间来,我的感觉是谭浩强就是厉害,编写的<C编程语言>系列丛书不愧是经典.书中对C语言的介绍既系统又全 ...

  4. Unity 3D开发-C#脚本语言的一些基础用法

    Unity 中C#语言的一些基础用法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lerp -- 线 ...

  5. C语言函数sscanf()的用法(转)

    转自:http://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html C语言函数sscanf()的用法 sscanf() - 从一个字符串中 ...

  6. C语言函数sscanf()的用法-从字符串中读取与指定格式相符的数据(转)

    C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var ...

  7. GO语言延迟函数defer用法分析

    这篇文章主要介绍了GO语言延迟函数defer用法,较为详细的分析了GO语言的特性与具体用法,并给出了一个比较典型的应用实例,具有一定的参考借鉴价值,需要的朋友可以参考下   本文实例讲述了GO语言延迟 ...

  8. C语言函数sscanf()的用法-(转自Walter L)

    在我的学习过程中,从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int ss ...

  9. 解决全局变量共享---C语言的extern关键字用法

    在调试程序时,有一个参数需要在多个函数之间传递,因为是作为调试参数,不想将参数引入到函数中. 很自然的想到使用全局变量来表示这个公共参数,工程代码的结构如下: main.c test.c test.h ...

随机推荐

  1. Java HashMap原理

    HashMap存储结构 HashMap中数据的存储是由数组与链表一起实现的 数组寻址非常容易,其时间复杂度为O(1),但是当要插入或删除数据时,时间复杂度就会变为O(n).链表插入和删除操作的内存复杂 ...

  2. 启动servlet报错:The servlets named [DemoServlet] and [main.java.com.wlf.demo.servlet.DemoServlet] are both mapped to the url-pattern [/hello] which is not permitted

    先看具体错误日志: [2019-04-26 09:29:25,484] Artifact demo-servlet:war: Artifact is being deployed, please wa ...

  3. WCF揭秘学习笔记(5):WF定制活动

    WF(Windows Workflow Foundation,Windows工作流基础)为.NET提供了一种基于模型的.声明方式的过程执行引擎,它改变了传统的通过一行行编写代码来开发服务功能的方式. ...

  4. cookie和session得区别

    1.cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据. 2.session其实指的就是访问者从到达某个特定主页到离开为止的那段时间. ...

  5. shell 11函数

    函数定义 function 方法名(){ command return int; } 注意:function可加可不加 #shell #!/bin/sh function fun1(){ echo & ...

  6. python simplejson and json 使用及区别

    ''' import simplejson as json #几个主要函数:dump.dumps.load.loads,带s跟不带s的区别: 带s的是对 字符串的处理,而不带 s的是对文件对像的处理. ...

  7. OSPF两种组播地址的区别和联系

    1.点到点网络: 是连接单独的一对路由器的网络,点到点网络上的有效邻居总是可以形成邻接关系的,在这种网络上,OSPF包的目标地址使用的是224.0.0.52.广播型网络, 比如以太网,Token Ri ...

  8. 理解Storm Metrics

    在hadoop中,存在对应的counter计数器用于记录hadoop map/reduce job任务执行过程中自定义的一些计数器,其中hadoop任务中已经内置了一些计数器,例如CPU时间,GC时间 ...

  9. RAII(Resource Acquisition Is Initialization)简介

    RAII(Resource Acquisition Is Initialization),也称为“资源获取就是初始化”,是C++语言的一种管理资源.避免泄漏的惯用法.C++标准保证任何情况下,已构造的 ...

  10. API网关Kong系列(三)添加服务

    进入之前部署好的kong-ui,默认第一次登陆需要配置kong服务的地址 进入API菜单,点击+号 按照要求填入相关信息 至此完成,可以使用诸如 https://your.domain.com:208 ...