channel是go语言中的同步工具,有两种模式
- 缓冲
程序执行序列将阻塞在读channel的调用处 <- chan; 或当channel满时,阻塞在写channel调用处 chan <-。
引用
Sends to a buffered channel block only when the buffer is full. Receives block when the buffer is empty.
- 非缓冲
程序执行序列将阻塞在读和写channel的调用处 chan <- 或 <- chan
引用
sends and receives block until the other side is ready.
1. 先来看看缓冲方式
package main
var a string
var c = make(chan int, 10)
func f() {
a = "hello world"
c <- 0
//<- c
}
func main() {
go f()
<- c
//c <- 0
print(a)
}
执行结果:
hello word
此时,goroutines f() 先给a赋值,再向channel c中写入0;goroutines main() 阻塞在 <- c处,直到 f() 中 向管道中c中写数据语句: c <- 0 执行。
如果将两处管道操作调换顺序,执行结果为空。因为,main()将不阻塞直接print a,此时f()中a = "hello world"语句可能未执行,所以不一定能有hello world输出。
2. 再看看非缓冲方式的管道
package main
var a string
var c = make(chan int)
func f() {
a = "hello world"
//c <- 0
<- c
}
func main() {
go f()
//<- c
c <- 0
print(a)
}
执行结果:
hello world
此时,goroutines main()阻塞在写c <- 0语句处;goroutines f() 先给a赋值,再读管道c。当读c执行后,main()执行其后的语句,此时 a 是被赋值的。
注:其实读写管道都将可能被阻塞,直到有一方的读或写完成
此时,将两处管道操作调换顺序,同样也能够保证执行顺序
go语言的channel是一个重要的同步工具,正确的使用能大大减少同步带来的麻烦
分享到:
相关推荐
在Channel部分,作者讲解了Go语言中的Channel机制,包括Channel的定义、初始化和使用。 程序结构 在程序结构部分,作者详细介绍了Go语言中的程序结构,包括源文件、包、测试等内容。 在源文件部分,作者讲解了Go...
Go语言,又称为Golang,是由Google公司开发的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。它由Robert Griesemer、Rob Pike及Ken Thompson三位开发者设计,旨在提高软件的构建效率和可维护性,特别...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。自2009年发布以来,Go语言因其简洁、高效的语法和强大的并发处理能力,逐渐在云计算、微服务、容器等领域获得了广泛...
- **起源**:Go语言由Google公司的Robert Griesemer、Rob Pike及Ken Thompson三位计算机科学家共同设计,旨在解决现代软件开发中的复杂性和效率问题。 - **发展历程**:Go语言自2007年开始设计,于2009年正式对外...
Go 语言中的 channel 是实现 goroutine 间无锁通信的关键机制,他使得写多线程并发程序变得简单、灵活、触手可得。下面就个人理解对 channel 使用过程中应该注意的地方进行一个简要的总结。
Go语言,也被称为Golang,是由Google公司于2007年设计并推出的开源编程语言。它的设计目标是简洁、高效和可并发。Go语言以其快速编译、垃圾回收、C-like语法和内置并发机制而受到开发者们的喜爱,尤其在云计算和...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的语言。它旨在提高编程效率,简化并发编程,并强调简洁的编程哲学。Go语言的设计受到了多门经典编程语言的影响,如C语言、...
Go语言,又称为Golang,是由Google开发的一种静态类型的、编译型的、并发型且垃圾回收的编程语言。它设计简洁、效率高,特别适合于编写服务器端和网络应用。Go语言的语法接近C语言,但同时也引入了诸如goroutine(轻...
Go语言的goroutine和channel等概念允许开发者用极小的代码量就能编写出高度并发的程序。Go语言还提供了内置的并发安全的类型和函数,比如sync包中的Mutex、WaitGroup等,这使得在多线程环境下进行数据同步和线程间...
Go语言,又称为Golang,是由Google公司推出的编程语言。其主要开发者包括肯·汤姆逊(Ken Thompson)、罗布·派克(Rob Pike)和罗伯特·格里泽默(Robert Griesemer)三位业界知名的大师级人物。以下是这三位开发者的简要...
Go语言,也被称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。自2009年发布以来,Go语言因其简洁的语法、高效的性能以及对并发编程的良好支持,受到了广大开发者的欢迎...
- **并发模型**:深入理解Go语言的并发模型,包括goroutine和channel的使用技巧。 - **内存管理**:探讨Go语言中的垃圾回收机制及其对性能的影响。 - **错误处理**:介绍Go语言特有的错误处理方式,如使用error类型...
Go语言中文文档高清版 Go语言中文文档高清版是Go语言的官方文档,涵盖了Go语言的基本概念、语法、标准库、框架、数据库、网络编程、并发编程、微服务等方面的知识点。 一、基本概念 * Go语言的主要特征:静态类型...
谷歌的Go语言,也被称为Golang,是由Google在2009年推出的一种开源编程语言。它被设计为简洁、高效、并发性好,并且具有内置的垃圾回收机制,使得开发人员可以更专注于编写可维护的代码。这个“谷歌GO语言教程PDF”...
1. 并发原生支持:Go语言通过goroutine和channel实现了轻量级线程,使得并发编程变得简单高效。 2. 垃圾回收(GC):Go语言内建了垃圾回收机制,自动管理内存,减轻了程序员的工作负担。 3. 动态和静态的结合:虽然...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的、C风格的编程语言。它旨在提高编程效率,简化系统编程,并且能够支持大规模的网络服务和分布式计算。Go语言实战教程是学习Go...
Go语言,通常被称为Golang,是由Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。它具有简洁、快速、安全和现代的特点。Go语言设计团队的初衷是为了让编程更加简单、高效,同时能够应对...
《Go语言实战》是一本深度剖析Go语言的书籍,它以中文的形式呈现,共计240页,并且配备了详尽的书签,便于读者查阅和学习。...书中的实例和实战经验将帮助你更好地运用Go语言,提升你的编程技能和效率。