本例中梳理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. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  2. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  3. SASS教程sass超详细教程

    SASS安装及使用(sass教程.详细教程) 采用SASS开发CSS,可以提高开发效率. SASS建立在Ruby的基础之上,所以得先安装Ruby. Ruby的安装: 安装 rubyinstaller- ...

  4. .NET Core的日志[2]:将日志输出到控制台

    对于一个控制台应用,比如采用控制台应用作为宿主的ASP.NET Core应用,我们可以将记录的日志直接输出到控制台上.针对控制台的Logger是一个类型为ConsoleLogger的对象,Consol ...

  5. NET Core-学习笔记(四)

    经过前面分享的三篇netcore心得再加上本篇分享的知识,netcore大部分常用知识应该差不多了,接下来将不会按照章节整合一起分享,因为涉及到的东西整合到一起篇幅太大了,所以后面分享将会按照某一个知 ...

  6. nodejs模块发布及命令行程序开发

    前置技能 npm工具为nodejs提供了一个模块和管理程序模块依赖的机制,当我们希望把模块贡献出去给他人使用时,可以把我们的程序发布到npm提供的公共仓库中,为了方便模块的管理,npm规定要使用一个叫 ...

  7. C#中如何创建PDF网格并插入图片

    这篇文章我将向大家演示如何以编程的方式在PDF文档中创建一个网格,并将图片插入特定的网格中. 网上有一些类似的解决方法,在这里我选择了一个免费版的PDF组件.安装控件后,创建新项目,添加安装目录下的d ...

  8. 【HanLP】HanLP中文自然语言处理工具实例演练

    HanLP中文自然语言处理工具实例演练 作者:白宁超 2016年11月25日13:45:13 摘要:HanLP是hankcs个人完成一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环 ...

  9. CRM 数据密钥 忘记 解决方案

    UPDATE EmailServerProfile SET IncomingPassword=nullUPDATE EmailServerProfile SET OutgoingPassword=nu ...

  10. H3 BPM让天下没有难用的流程之产品概述

    一.产品简介 BPM(Business Process Management),是指根据业务环境的变化,推进人与人之间.人与系统之间以及系统与系统之间的整合及调整的经营方法与解决方案的IT工具. H3 ...