前面讲的都是一些Go 语言的基础知识,感兴趣的朋友可以先看看之前的文章。https://www.cnblogs.com/zhangweizhong/category/1275863.html

今天就来讲讲go 里面的高级功能,也是go语言重要的特性:Go协程(Goroutine)。

什么是Go协程

Go协程(Goroutine)是与其他函数同时运行的函数。可以认为Go协程是轻量级的线程,由Go运行时来管理。

在函数调用前加上go关键字,这次调用就会在一个新的goroutine中并发执行。当被调用的函数返回时,这个goroutine也自动结束。听着感觉像C# 中的Task。

需要注意的是,如果这个函数有返回值,那么这个返回值会被丢弃。

Go 协程(Goroutine)之间通过信道(channel)进行通信,简单的说就是多个协程之间通信的管道。信道可以防止多个协程访问共享内存时发生资源争抢的问题。

如何使用

package main

import (
"fmt"
"time"
) func hello() {
fmt.Println("Hello world goroutine")
}
func main() {
go hello()
time.Sleep( * time.Second)
fmt.Println("main function")
}

Channel(管道)

Channel(管道) 可以被认为是协程之间通信的管道。与水流从管道的一端流向另一端一样,数据可以从信道的一端发送并在另一端接收。

1. 定义

每个channel都有一个类型。此类型是允许信道传输的数据类型。channel是类型相关的,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。

 

2. 声明

a. 我们需要通过内置函数 make 来创建一个信道。

下面的代码声明了一个信道:

var ch chan int

b. 与其他变量定义一样,快速声明也是定义信道的一种有效而简洁的方式:

a := make(chan int) 

c. 创建一个带缓冲的channel

c := make(chan int, )

// 从带缓冲的channel中读数据
for i:=range c {
  ...
}

3. 发送和接收数据

通过信道发送和接收数据的语法如下:

data := <- a   // 从channel a 读取数据
a <- data // 将数据写入到 channel a

箭头的指向说明了数据是发送还是接收。

完整例子

下面就直接说说,Goroutine和channel 共同使用的完整例子:

package main

import (
"fmt"
"time"
) func Producer(queue chan<- int) {
for i := ; i < ; i++ {
queue <- i //写入
fmt.Println("create :", i)
}
} func Consumer(queue <-chan int) {
for i := ; i < ; i++ {
v := <-queue // 读出
fmt.Println("receive:", v)
}
} func main() {
queue := make(chan int, )
go Producer(queue)
go Consumer(queue)
time.Sleep( * time.Second)
}

最后

以上,就简单的介绍了Go语言中的协程(Goroutine)和信道(channel)。这两个功能特性,是go语言中重要的特性。大家可以写写其他的例子,熟悉掌握。

Golang 入门系列(六)理解Go中的协程(Goroutine)的更多相关文章

  1. golang源码阅读:VictoriaMetrics中的协程优先级的处理方式

    在阅读VictoriaMetrics的源码的时候,读到了那么平平无奇的一段: // AddRows adds the given mrs to s. func (s *Storage) AddRows ...

  2. C# 互操作性入门系列(三):平台调用中的数据封送处理

    好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...

  3. [转]C# 互操作性入门系列(三):平台调用中的数据封送处理

    参考网址:https://www.cnblogs.com/FongLuo/p/4512738.html C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列( ...

  4. [转]C# 互操作性入门系列(一):C#中互操作性介绍

    传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...

  5. 用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署

    用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的Code First迁移和部署 这是微软官方SignalR 2.0教程Getting Started with En ...

  6. golang中最大协程数的限制(线程)

    golang中最大协程数的限制 golang中有最大协程数的限制吗?如果有的话,是通过什么参数控制呢?还是通过每个协程占用的资源计算? 通过channel控制协程数的就忽略吧. 以我的理解,计算机资源 ...

  7. Unity中的协程(一)

    这篇文章很不错的问题,推荐阅读英文原版: Introduction to Coroutines Scripting with Coroutines   这篇文章转自:http://blog.csdn. ...

  8. 深入tornado中的协程

    tornado使用了单进程(当然也可以多进程) + 协程 + I/O多路复用的机制,解决了C10K中因为过多的线程(进程)的上下文切换 而导致的cpu资源的浪费. tornado中的I/O多路复用前面 ...

  9. python中的协程:greenlet和gevent

    python中的协程:greenlet和gevent 协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. 1.通过yield实现协程: 代码: import time def A(): ...

随机推荐

  1. Python迭代和解析(2):迭代初探

    解析.迭代和生成系列文章:https://www.cnblogs.com/f-ck-need-u/p/9832640.html 在Python中支持两种循环格式:while和for.这两种循环的类型不 ...

  2. .Net语言 APP开发平台——Smobiler学习日志:如何快速实现Timer计时功能

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的”Smobil ...

  3. 第17章 社区快速入门和模板 - Identity Server 4 中文文档(v1.0.0)

    IdentityServer组织不维护这些示例.IdentityServer组织愉快地链接到社区模板,但不能对模板做出任何保证.请直接与作者联系. 17.1 各种ASP.NET核心安全样本 https ...

  4. 第12章 添加对外部认证的支持 - Identity Server 4 中文文档(v1.0.0)

    注意 对于任何先决条件(例如模板),首先要查看概述. 接下来,我们将添加对外部认证的支持.这非常简单,因为您真正需要的是ASP.NET Core兼容的身份验证处理程序. ASP.NET Core本身支 ...

  5. Html5 localStorage 缓存

    1.客户端页面临时存贮数据变化多段,cookie ,session, data-xxx , hidden input 这些司空见惯不废话,我们采用 localStorage 特点:1.数据不会删除,除 ...

  6. Sql Server 查询外键对应的Table 的通用方法

    SELECT oSub.name AS [子表名称] , fk.name AS [外键名称] , SubCol.name AS [子表列名] , oMain.name AS [主表名称] , Main ...

  7. JavaWeb学习日记----SAX解析XML

    1.SAX解析XML文档的方式: 与DOM方式解析不同,DOM方式解析是根据XML的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象.优点是可以很方便实现增删改操作.缺点是,如 ...

  8. php注册、登录界面的制作

    当初我觉得一个网站上注册和登录这两个功能很神奇,后来自己研究一下发现其实道理很简单,接下来看一下怎么实现的吧.... 我实在我的电脑上建了几个文件: login.html (登录页面) registe ...

  9. Registrator中文文档

    目录 快速入门 概述 准备 运行Registrator 运行Redis 下一步 运行参考 运行Registrator Docker选项 Registrator选项 Consul ACL令牌 注册URI ...

  10. 关于如何使用xposed来hook某支付软件

    由于近期有业务上的需要,所以特地花时间去研究了一下如何使用hook技术.但是当我把xposed环境和程序编写完成时,突然发现手机上的某个支付软件无法使用了.这个时候我意识到,应该是该软件的安全机制在起 ...