本例中梳理go语言中的协程和通道。

package main

import (
"fmt"
"time"
) //func01、func02 为演示同步机制
func func01(in chan int) {
fmt.Println("func01 in")
in <-
fmt.Println("func01 out")
} func func02(in chan int) {
fmt.Println("func02 in")
out := <-in
fmt.Println(out)
fmt.Println("func02 out")
} //func03, func04 为演示消息传输机制
func func03(in chan int) {
for i := ; i < ; i++ {
fmt.Printf("Send Msg:%d\n", i)
in <- i
}
} func func04(in chan int) {
for {
fmt.Printf("Receive Msg:%d\n", <-in)
}
} func main() { /*通道是协程之间的数据传输通道,类似操作系统中采用管道进行进程间通信
协程向通道写入数据,如果通道满,挂起协程,知道队列中空出
协程向通道读取数据,如果无数据,挂起协程,直到有数据。*/ //10为channel的可选参数,默认是0,表示channel的缓冲区
//为0时成为无缓冲channel,用来做同步 ch := make(chan int) ch2 := make(chan int, ) /*
* 同步机制,打印结果为:
* func02 in
* func01 in
* func01 out
* 2
* func02 out
* main end
*/
//go func02(ch)
//go func01(ch) /*
* 消息交互,打印结果为:
* Send Msg:0
* Send Msg:1
* Send Msg:2
* Receive Msg:0
* Receive Msg:1
* Receive Msg:2
* Send Msg:3
* Receive Msg:3
* main end
* 一次性能发送几条消息,取决于定义channel时设置的
* 缓冲区大小
*/ go func03(ch2)
go func04(ch2) time.Sleep(1e9)
fmt.Println("main end")
close(ch)
}

在实际项目中,我们可以通过定义一个全局的channel map来维护多通道的数据传输,例如:

var MsgQuene quene

type MsgQuene struct {
chans map[uint8]chan string
} //初始化消息队列
func (q *MsgQuene) Init() {
q.chans = make(map[uint8]chan string)
} //为某一个消息通道,增加对应的channel
func (q *MsgQuene) addQuene(id uint8) {
q.chans[id] = make(chan string)
} //为某一个消息通道,删除对应的channel
func (q *MsgQuene) deleteQuene(id uint8) {
delete(q.chans, id)
} //从指定消息通道中读取数据
func (q *MsgQuene) Get(id uint8) string {
return <-q.chans[id]
} //从指定消息通道中写入数据
func (q *MsgQuene) Put(id uint8, s string) {
q.chans[id] <- s
}

GO基础(二)的更多相关文章

  1. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  2. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  3. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  4. Bootstrap<基础二十七> 多媒体对象(Media Object)

    Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...

  5. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  6. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  7. Bootstrap<基础二十四> 缩略图

    Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...

  8. Bootstrap <基础二十三>页面标题(Page Header)

    页面标题(Page Header)是个不错的功能,它会在网页标题四周添加适当的间距.当一个网页中有多个标题且每个标题之间需要添加一定的间距时,页面标题这个功能就显得特别有用.如需使用页面标题(Page ...

  9. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  10. Bootstrap <基础二十一>徽章(Badges)

    Bootstrap 徽章(Badges).徽章与标签相似,主要的区别在于徽章的边角更加圆滑. 徽章(Badges)主要用于突出显示新的或未读的项.如需使用徽章,只需要把 <span class= ...

随机推荐

  1. boosting、adaboost

    1.boosting Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数.他是一种框架算法,主要是通过对样本集的操作获 ...

  2. Android Ormlite 学习笔记1 -- 基础

    Ormlite 是一个开源Java数据实体映射框架.其中依赖2个核心类库: 1.ormlite-android-4.48.jar 2.ormlite-core-4.48.jar 新建项目,引用上面2个 ...

  3. CRL快速开发框架系列教程七(使用事务)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  4. AFNetworking 3.0 源码解读(八)之 AFImageDownloader

    AFImageDownloader 这个类对写DownloadManager有很大的借鉴意义.在平时的开发中,当我们使用UIImageView加载一个网络上的图片时,其原理就是把图片下载下来,然后再赋 ...

  5. 几个有趣的WEB设备API 前端提高B格必备(一)——电池状态&震动api

    受到同事启发,突然发现了几个有趣又实用的web api,没想到前端还有这么多有趣的东西可以玩~~简直过分. 1.电池状态API navigator.getBattery():这个api返回的是一个pr ...

  6. Velocity初探小结--velocity使用语法详解

    做java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上 ...

  7. ASP.NET Core 中文文档 第四章 MVC(4.4)依赖注入和控制器

    原文: Dependency Injection and Controllers 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core MVC 控制器应通过 ...

  8. Django admin定制化,User字段扩展[原创]

    前言 参考上篇博文,我们利用了OneToOneField的方式使用了django自带的user,http://www.cnblogs.com/caseast/p/5909248.html , 但这么用 ...

  9. Java获取本机的IP与MAC地址

    有些机器有许多虚拟的网卡,获取IP地址时会出现一些意外,所以需要一些验证: // 获取mac地址 public static String getMacAddress() { try { Enumer ...

  10. 负载均衡——nginx理论

     nginx是什么? nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡.具有高性能.轻量级.内存消耗少,强大的负载均衡能力等优势.  nginx架构? ...