本例中梳理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. Ajax及跨域

    概念 Ajax Ajax,Asynchronous JavaScript and XML,字面意思:异步的 JavaScript 和 XML,是指一种创建交互式网页应用的网页开发技术. 用于异步地去获 ...

  2. 用scikit-learn学习主成分分析(PCA)

    在主成分分析(PCA)原理总结中,我们对主成分分析(以下简称PCA)的原理做了总结,下面我们就总结下如何使用scikit-learn工具来进行PCA降维. 1. scikit-learn PCA类介绍 ...

  3. TODO:macOS上ThinkPHP5和Semantic-UI集成

    TODO:macOS上ThinkPHP5和Semantic-UI集成 1. 全局安装 (on OSX via homebrew)Composer 是 homebrew-php 项目的一部分 2. 把X ...

  4. 阿里签名中URLEncode于C#URLEncod不同之处

    问题 如上图所示,阿里云的PercentEncode 转换! 为 %21 PercentEncode 源码为: package com.aliyuncs.auth; import java.io.Un ...

  5. Tesseract-OCR字符识别简介

    OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程.Tesseract:开源的OCR识别引擎,初期Tesseract引擎 ...

  6. CRL快速开发框架系列教程三(更新数据)

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

  7. XSS分析及预防

    XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行.在WEB前端应用日益发展的今天,XSS漏洞尤其容易被开发人员忽视,最终可能造成对个人信息 ...

  8. android 两种实现计时器时分秒的实现,把时间放在你的手中~

    可能我们在开发中会时常用到计时器这玩意儿,比如在录像的时候,我们可能需要在右上角显示一个计时器.这个东西其实实现起来非常简单. 只需要用一个控件Chronometer,是的,就这么简单,我都不好意思讲 ...

  9. 代码的坏味道(21)——中间人(Middle Man)

    坏味道--中间人(Middle Man) 特征 如果一个类的作用仅仅是指向另一个类的委托,为什么要存在呢? 问题原因 对象的基本特征之一就是封装:对外部世界隐藏其内部细节.封装往往伴随委托.但是人们可 ...

  10. C#发送邮箱

    之前自己从来没有做过发送邮箱的功能,前段时间项目需要,在找了很多帖子之后,终于实现了. 之后有整理了一下,写了一个类.直接给类传递信息,就可以发送了. 这里还需要说明的是,发送邮箱需要开通POP3/S ...