GO基础(二)

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

package main

import (
    "fmt"
    "time"
)

//func01、func02 为演示同步机制
func func01(in chan int) {
    fmt.Println("func01 in")
    in <- 2
    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 := 0; i < 4; 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, 1)

    /*
    *  同步机制,打印结果为:
    *  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
}
时间: 2024-08-05 03:38:45

GO基础(二)的相关文章

Html5开发——html+css基础二(个人博客一)

今天没有写完,而且写的还有点问题,所以今天就先不上传代码了(ps:快写完了才发现布局有问题,导致代码太多,感觉写的不是很好,所以今天先分析一下布局) 第一步先写一个大的div用来放ABC三个部分,这个大的div居中! 第二步分别写ABC三个部分,ABC三个部分分别使用浮动(float)来定位.A和B都各使用了一张非常小的图片,通过重复(repeat)属性生成A和B 第三步C部分分别写好3~16这几个模块,在通过组合利用浮动定位.分组如下: E:3 F:4.7.10.13 G:5.8.11.14

Scala 中的函数式编程基础(二)

主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. 2. Higher Order Functions 把其他函数作为参数或者作为返回值,就是 higher order functions,python 里面也可以看到这样使用的情形.在酷壳上的博客有一个例子就是将函数作为返回值. 2.1 匿名函数 在 python 里边叫 lambda 函数,常常与 map(

Python全栈开发【基础二】

Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 1 class int(object): 2 """ 3 int(x=0) -> integer 4 int(x, base=10) -&g

R语言基础(二) 可视化基础

> which.max(apply(x[c("x1","x2","x3")], 1, sum))49 > x$num[which.max(apply(x[c("x1","x2","x3")], 1, sum))][1] 2005138149 > hist(x$x1) > plot(x$x1,x$x2) > table(x$x1) 80 81 82 83 84

Bootstrap &lt;基础二十五&gt;警告(Alerts)

警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个可选的关闭按钮.为了创建一个内联的可取消的警告框,请使用 警告(Alerts) jQuery 插件. 您可以通过创建一个 <div>,并向其添加一个 .alert class 和四个上下文 class(即 .alert-success..alert-info..alert-warning..ale

图像处理之基础---二维卷积运算原理剖析

卷积运算(Convolution)是通过两个函数f 和g 生成第三个函数的一种数学算子,表示函数f 与经过翻转和平移与g 的重叠部分的累积.如果将参加卷积的一个函数看作区间的指示函数,卷积还可以被看作是“滑动平均”的推广.假设: f(x),g(x)是R1上的两个可积函数,并且积分是存在的.这样,随着 x 的不同取值,这个积分就定义了一个新函数h(x),称为函数f 与g 的卷积,记为h(x)=(f*g)(x). 两个向量卷积,说白了就是多项式乘法.下面用个矩阵例子说明其工作原理: a和d的卷积就是

Bootstrap &lt;基础二十六&gt;进度条

Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet Explorer 9 及之前的版本和旧版的 Firefox 不支持该特性,Opera 12 不支持动画. 默认的进度条 创建一个基本的进度条的步骤如下: 添加一个带有 class .progress 的 <div>. 接着,在上面的 <div> 内,添加一个带有 class .prog

Python基础二--基本控制语句

基本接触每一种语言,都需要做的:1.print 一个"Hello world!" 2.了解基本的数据类型 3.学习控制语句. 当我们学习控制语句,一般都离不开if,for ,while,switch(case).本文就做一个简单的介绍python的基本控制语句,其中我们用if while来做一个经典的"猜数字游戏",if for来做一个"输出完美数". 在此之前,对于一些没用过python的同学而熟悉c/c++等用{}来做块的要注意了,pytho

Bootstrap &lt;基础二十八&gt;列表组

列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 class .list-group-item. 下面的实例演示了这点: <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 基本的列表组</title> <link href="/boo

Bootstrap &lt;基础二十二&gt;超大屏幕(Jumbotron)

Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: 创建一个带有 class .jumbotron. 的容器 <div>. 除了更大的 <h1>,字体粗细 font-weight 被减为 200px. 下面的实例演示了这点: <!DOCTYPE html> <html> <head> <tit