关键词:
一、概念
channel是golang语言级别提供的协程(goroutine)之间的通信方式。
goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。那么goroutine之间如何进行数据的通信呢,Go提供了一个很好的通信机制channel。channel可以与Unix shell 中的双向管道做类比:可以通过它发送或者接收值。这些值只能是特定的类型:channel类型。定义一个channel时,也需要定义发送到channel的值的类型。
二、声明方式
var chanName chan ElementType
var ch chan int
使用make,可以指定channel容量
ch = make(chan int)
三、channel得读和写
channel通过操作符<-来接收和发送数据
ch <- v // 发送v到channel ch. 写数据
v := <- ch // 从ch中接口数据,并赋值给v 读数据
默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得Goroutines同步变的更加的简单,而不需要显式的lock。所谓阻塞,也就是如果读取(value := <-ch)它将会被阻塞,直到有数据接收。其次,任何发送(ch<-5)将会被阻塞,直到数据被读出。无缓冲channel是在多个goroutine之间同步很棒的工具。
四、code
package main
import (
"fmt"
"strconv"
)
//定义一个加法函数,传入channel类型,每计算一次,quit加1
func Add(x, y int, quit chan int)
z := x + y
fmt.Println(z)
//写数据
quit <- 1
//接受数据,并赋值给我
func Read(ch chan int)
value := <- ch
fmt.Println("value" + strconv.Itoa(value))
func Write(ch chan int)
//ch <- 10
func main()
//定义一个channel类型切片数组
chs := make([]chan int, 10)
//循环执行加法函数
for i := 0; i < 10; i++
//拿取一个channel
chs[i] = make(chan int)
//执行goroutine和发送一个channel类型数据
go Add(i, i, chs[i])
for _, v := range chs
//接口channel类型数据
<- v
go语言自学系列|golang并发编程之channel的遍历(代码片段)
视频来源:B站《golang入门到项目实战[2021最新Go语言教程,没有废话,纯干货!持续更新中...]》一边学习一边整理老师的课程内容及试验笔记,并与大家分享,请移步至知乎网站,谢谢支持!附上... 查看详情
go语言学习之旅--并发编程
...time包golang并发编程之Mutex互斥锁实现同步golang并发编程之channel的遍历golang并发编程之selectswitchgolang并发编程之Timergolang并发编程之原子变量的引入golang并发编程之原子操作详 查看详情
go语言学习之旅--并发编程
...time包golang并发编程之Mutex互斥锁实现同步golang并发编程之channel的遍历golang并发编程之selectswitchgolang并发编程之Timergolang并发编程之原子变量的引入golang并发编程之原子操作详 查看详情
go语言学习之旅--并发编程
...time包golang并发编程之Mutex互斥锁实现同步golang并发编程之channel的遍历golang并发编程之selectswitchgolang并发编程之Timergolang并发编程之原子变量的引入golang并发编程之原子操作详解golang并发编程之协程https://blog.csdn.net/guolianggsta/article... 查看详情
golang并发编程之生产者消费者(代码片段)
golang最吸引人的地方可能就是并发了,无论代码的编写上,还是性能上面,golang都有绝对的优势学习一个语言的并发特性,我喜欢实现一个生产者消费者模型,这个模型非常经典,适用于很多的并发场景,下面我通过这个模型,... 查看详情
golang之goroutine和channel(代码片段)
多线程程序在单核上运行,就是并发多线程程序在多核上运行,不是并行Go协程和Go主线程 Go主线程(线程):一个Go线程上,可以起多个协程,你可以这样理解,协程是轻量级的线程 Go协程的特点: 1)有独立的... 查看详情
go语言自学系列|golang并发编程之selectswitch(代码片段)
...itch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。select的case语句必须是一个channel的操作select的default子句总是... 查看详情
go语言自学系列|golang并发编程之mutex互斥锁实现同步(代码片段)
...|汇总-知乎(zhihu.com)https://zhuanlan.zhihu.com/p/484035621除了使用channel实现同步之外,还可以使用Mutex互斥锁的方式实现同步。packagemainimport("fmt""sync""time")varmint=100varlocksync.Mutexvarwtsync.WaitGroupfuncadd()deferwt.Done()lock.... 查看详情
go_csp并发模型(代码片段)
...代提出的,用于描述两个独立的并发实体通过共享的通讯channel(管道)进行通信的并发模型。相对于Actor模型,CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel。严格来说,CSP是一门形式语言... 查看详情
golang学习随便记9(代码片段)
goroutine和channel (1)golang有两种并发编程风格,基于CSP的goroutine+channel或者传统的共享内存多线程模型。毫无疑问,goroutine和channel是golang引以为傲的东西,虽然背后理论不是革命性的东西,但它足够有... 查看详情
并发编程如果用channel解决并发问题?(代码片段)
...河系】期待你的关注。未来大家一起加油啊~前言什么是Channel?在Go语言基础中应该就学过Channel,那个时候应该都认为只是一个基础类型,是一个管道一样类似的东西,方便快速读写操作,但是Channel在并发中... 查看详情
golang语言并发与并行——goroutine和channel的详细理解(代码片段)
如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人。Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库来新建线程,还要用线程安全的队列库来共享数据。以下是我... 查看详情
在golang中是锁或channel还是atomic(代码片段)
与其他编程语言一样在并发环境下如不对多个goroutine(线程)访问或修改的共享资源元素的进行控制,让进入临界区的对象互斥。就可能会出现数据异常情况; 一个非线程安全对象如下,如不对Id的访问进行控制,多个g... 查看详情
[golang]channel通道(代码片段)
说明channel是go当中的一个核心类型,可以看做是管道。并发核心单元可以通过channel进行数据的发送和接收,从而实现通信。在go中,channel是一种数据类型,主要被用来解决协程的同步问题以及协程之间数据共享(数据传递)的问题... 查看详情
如何优雅的关闭golang的channel(代码片段)
HowtoGracefullyCloseChannels,这篇博客讲了如何优雅的关闭channel的技巧,好好研读,收获良多。众所周知,在golang中,关闭或者向已关闭的channel发送数据都会引发panic。谨遵优雅关闭channel的原则不要在接受一端关闭channel不要在有多个... 查看详情
golang入门到项目实战golang并发变成之通道channel
参考技术AGo提供了一种称为通道的机制,用于在goroutine之间共享数据。当您作为goroutine执行并发活动时,需要在goroutine之间共享资源或数据,通道充当goroutine之间的管道(管道)并提供一种机制来保证同步交换。根据数据交换的... 查看详情
go并发编程基础-channel(代码片段)
协程(Goroutine)Go语言中没有线程的概念,只有协程,也称为goroutine。相比线程来说,协程更加轻量,一个程序可以随意启动成千上万个goroutine。goroutine被Goruntime所调度,这一点和线程不一样。也就是说,Go语言的并发是由Go自己... 查看详情
go语言之并发编程channel
单向channel:单向通道可分为发送通道和接收通道。但是无论哪一种单向通道,都不应该出现在变量的声明中,假如初始化了这样一个变量varuselessChanchan<-int=make(chan<-int,10)这样一个变量该如何使用呢,这样一个只进不出的通道... 查看详情