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 ...
随机推荐
- Array.isArray() 判断是不是数组
var arr = new Array(); if(Array.isArray()){ console.log('yes') } else { conssole.log('no') }
- springBoot启动后 http://localhost:8080 地址无法访问
http://localhpost:8080/hello 代码结构: 代码内容: @RestController public class HelloWordRestImpl implements H ...
- JS排序算法--冒泡排序和选择排序
在我们JS语法当中,数据类型中的复杂数据类型,有一项我们常用的数组数据类型,其中存储的数据有时是乱序的,需要排序,我们有多种方法,最简单的肯定是 :变量.sort(fonction(a,b){a> ...
- 「每天五分钟,玩转 JVM」:对象访问定位
前言 在「对象内存布局」一节中,我们了解到对象头中包含了一个叫做类型指针的东西,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.但是,并不是所有的虚拟机都是这么去做的.不 ...
- 小白学 Python 数据分析(18):Matplotlib(三)常用图表(上)
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- mysql8 修改root密码
Navicat工具里选中mysql数据库 执行: ALTER user 'root'@'localhost' IDENTIFIED BY 'newpassward'; //newpassward 新密 ...
- python报错:ERROR: No matching distribution found for dns.resolver
可能有的小伙伴在安装dns.resolver的时候会遇到这个问题: 我百度的时候别人是: pip install dns-python 但是我这样安装也还是错误.有些时候是这个包改名了所以你没有搜索到 ...
- django复习 以及源码
django请求生命周期 在浏览器上输入网址会发生什么事?(地址会朝我对应的ip地址发送get请求,get请求遵循http协议)先进入实现了wsgi协议的web服务器---->进入django- ...
- 【2019牛客暑期多校第三场】J题LRU management
题目链接 题意 好吧,这道题我其实看都没看过,队友跟我说了说这道题是模拟题,卡时间.然后我就上了-- 大致就是维护一个线性表,然后有两种操作:插入.查询 插入时,如果这个值(string)之前出现过, ...
- windows10删除用户头像
点击开始菜单,然后这里我们点击最上方的用户,弹出的界面,点击这里的更改帐户设置,大家如图进行操作,点击这里即可. 这里我们通过浏览可以修改自己的账户头像,问题是怎么删除这里使用过的账户头像呢?这里 ...