go的channel
go语言channel
go语言提供了goroutine来实现并发,go语言也提供了channel来实现并发事件之间的通信。
传统的编程语言通过共享内存来实现通信,当多个线程同时操作一个共享变量的时候,为了使程序达到预期的目的,可能会对变量加锁,这样就会使并发的程序等待,造成程序局部串行。而go的channel的设计理念是通过通信来共享内存。channel是一种特殊的类型,它遵循先进先出的原则,保证数据的收发顺序。go语言中的goroutine可以通过channel来通信。
chan的声明
import "fmt"
func main() {
var chan1 chan int // 声明int类型的chan
// chan是引用类型,必须舒适化后才能使用
chan1 = make(chan int, 10)
fmt.Println(chan1) // 0xc000082000
}
chan的声明有一点需要注意,那就是chan必须要用make初始化才能使用
chan的操作
package main
import "fmt"
func main() {
var chan1 chan int // 声明int类型的chan
// chan是引用类型,必须舒适化后才能使用
chan1 = make(chan int, 10)
// 向chan中传入10
chan1 <- 10
// 从chan中取值
x := <-chan1
fmt.Println(x)
// 关闭chan
close(chan1)
}
chan如果要使用也必须有一个缓冲区
当chan里面存的数据将缓冲区填满了,别的goroutine在想往chan中传输数据就得等待chan空余的位置,所以当创建一个chan的时候需要合理的给与chan的缓冲
关闭chan使用内置的close函数,关闭后的chan只能读值,不能存值
关闭已经关闭的chan会应发panic,关闭一个nil的chan也会应发panic
多个goroutine操作一个chan和chan的for循环
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
var chan1 chan interface{}
func add_to_chan(c chan interface{}, i int) {
c <- i
wg.Done()
}
func main() {
// 过个goroutine往chan里添加数据
chan1 = make(chan interface{}, 200)
for i := 1; i < 100; i++ {
wg.Add(1)
go add_to_chan(chan1, i)
}
wg.Wait()
defer close(chan1)
// chan的for循环
for i := range chan1 {
fmt.Println(i)
}
}
单向通道
有时候只想让一个通道只实现取值或者只存值,这时候后就需要用到单向通道了
单向通道一般用于函数的参数
func chan_demo(c1 <-chan interface{}, c2 chan<- interface{}) {
}
如上所示,c1只能为一个取值的通道,而c2是一个存值的通道
go的channel的更多相关文章
- Golang, 以17个简短代码片段,切底弄懂 channel 基础
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...
- TODO:Go语言goroutine和channel使用
TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语言运行时(runtime)管理.使用的时候在函数前面加"go"这个 ...
- GO语言之channel
前言: 初识go语言不到半年,我是一次偶然的机会认识了golang这门语言,看到他简洁的语法风格和强大的语言特性,瞬间有了学习他的兴趣.我是很看好go这样的语言的,一方面因为他有谷歌主推,另一方面他确 ...
- Critical: Update Your Windows Secure Channel (cve-2014-6321,MS14-066)
前言:风雨欲来山满楼,下半年开始各种凶猛的漏洞层出不穷,天下已经不太平,互联网已经进入一个新的台阶 0x01 cve-2014-6321 11月的补丁月,微软请windows的用户吃了顿大餐,发布了1 ...
- JAVA NIO Channel
Basic: 多数通道都是链接到开发的文件描述符的.Channel类提供维持平台独立性的抽象过程. 通道是一种途径,访问和操作操作系统,缓冲区是数据操作点: Channel类继承结构图: 通过 ...
- channel Golang
Golang, 以17个简短代码片段,切底弄懂 channel 基础 (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的 ...
- go channel
channel 是go语言中不同goroutine之间通信一种方法 //定义一个channel c := make(chan bool) //向channel中写入 c <- true //读取 ...
- [bigdata] flume file channel CPU消耗比 memory channel高的原因
https://www.quora.com/Why-does-flume-take-more-resource-CPU-when-file-channel-is-used-compared-to-wh ...
- 图解Netty之Pipeline、channel、Context之间的数据流向。
声明:本文为原创博文,禁止转载. 以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件) 当用户调用channel的connect时,会发起一个 ...
- go:channel(未完)
注:1)以下的所有讨论建立在包含整形元素的通道类型之上,即 chan int 2)对于“<-”我的理解是,它可能是一个操作符(接收操作符),也 可能是类型的一部分(如“chan<- in ...
随机推荐
- [头脑风暴] 解读Docker Bridge网络模型
背景 这几天在研究Kubernetes, 遇到一个有意思的nodejs镜像:luksa/kubia # 不带端口映射启动容器docker run -it -d luksa/kubia# 连接到默认的B ...
- Windows下EDK2环境的搭建以及经典的程序设计Print Hello World !-----(Linux下的待后续熟练了再更新)
很久没有更新博客了,之前的博客末尾有提到过要写有关EDK2环境搭建的博客,现在就是完成的时候了,后续博客更新会比较规律(大概每周一篇?) 本人博客仅仅发表于博客园,本人主页为 http ...
- js中的堆和栈
http://www.jscwwd.com/article/5e533ae2552a8e2bf45d3d69 这里先说两个概念:1.堆(heap)2.栈(stack)堆 是堆内存的简称.栈 是栈内存的 ...
- python基础学习day03
基础数据类型总览 why:机器无法像人一样分编各种类型 int(数字) str(字符串)作用:存储少量信息. '12','我和你','qw' bool值 作用:判断真假 True False list ...
- LeetCode-矩形重叠
题目描述: 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的是,只在 ...
- IOptions、IOptionsMonitor以及IOptionsSnapshot
背景 ASP.NET Core引入了Options模式,使用类来表示相关的设置组.简单的来说,就是用强类型的类来表达配置项,这带来了很多好处.初学者会发现这个框架有3个主要的面向消费者的接口:IOpt ...
- .net core 依赖注入, autofac 简单使用
综述 ASP.NET Core 支持依赖注入, 也推荐使用依赖注入. 主要作用是用来降低代码之间的耦合度. 什么是控制反转? 控制反转(Inversion of Control,缩写为IoC),是面 ...
- hdu1072 逃离迷宫系列 bfs
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1072/ 题意:逃离迷宫,路中可能有炸弹,总时间是6个单位,在有炸弹的位置,如果到达的时刻时间大于0,则恢复到6时 ...
- 题解 P2755 【洗牌问题】
这是本人的第一篇题解 请多多宽恕 这一道题其实不要用数组 我们来观察一下n=3时的情况: 原: 1 2 3 4 5 6 4 1 5 2 6 3 2 4 6 1 3 5 1 2 3 4 5 6 我们去观 ...
- [bfs,深度记录] East Central North America Regional Contest 2016 (ECNA 2016) D Lost in Translation
Problem D Lost in Translation The word is out that you’ve just finished writing a book entitled How ...