`
jack_boy
  • 浏览: 137289 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

go语言中的channel

阅读更多
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是一个重要的同步工具,正确的使用能大大减少同步带来的麻烦
分享到:
评论

相关推荐

    Go语言学习笔记.pdf 共174页

    在Channel部分,作者讲解了Go语言中的Channel机制,包括Channel的定义、初始化和使用。 程序结构 在程序结构部分,作者详细介绍了Go语言中的程序结构,包括源文件、包、测试等内容。 在源文件部分,作者讲解了Go...

    Go语言实战.pdf_go语言_Go_go_Go语言实战_

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。自2009年发布以来,Go语言因其简洁、高效的语法和强大的并发处理能力,逐渐在云计算、微服务、容器等领域获得了广泛...

    Go语言技术参考手册 中文PDF版

    - **起源**:Go语言由Google公司的Robert Griesemer、Rob Pike及Ken Thompson三位计算机科学家共同设计,旨在解决现代软件开发中的复杂性和效率问题。 - **发展历程**:Go语言自2007年开始设计,于2009年正式对外...

    Go语言中 Channel 详解

    Go 语言中的 channel 是实现 goroutine 间无锁通信的关键机制,他使得写多线程并发程序变得简单、灵活、触手可得。下面就个人理解对 channel 使用过程中应该注意的地方进行一个简要的总结。

    韩顺平_Go语言核心编程完整版笔记.zip

    Go语言,也被称为Golang,是由Google公司于2007年设计并推出的开源编程语言。它的设计目标是简洁、高效和可并发。Go语言以其快速编译、垃圾回收、C-like语法和内置并发机制而受到开发者们的喜爱,尤其在云计算和...

    Go语言圣经,golang学习入门到精通

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的语言。它旨在提高编程效率,简化并发编程,并强调简洁的编程哲学。Go语言的设计受到了多门经典编程语言的影响,如C语言、...

    GO 语言学习辅导共220页.pdf

    Go语言,又称为Golang,是由Google开发的一种静态类型的、编译型的、并发型且垃圾回收的编程语言。它设计简洁、效率高,特别适合于编写服务器端和网络应用。Go语言的语法接近C语言,但同时也引入了诸如goroutine(轻...

    Go语言学习笔记.pdf

    Go语言的goroutine和channel等概念允许开发者用极小的代码量就能编写出高度并发的程序。Go语言还提供了内置的并发安全的类型和函数,比如sync包中的Mutex、WaitGroup等,这使得在多线程环境下进行数据同步和线程间...

    go语言圣经 .pdf

    Go语言,又称为Golang,是由Google公司推出的编程语言。其主要开发者包括肯·汤姆逊(Ken Thompson)、罗布·派克(Rob Pike)和罗伯特·格里泽默(Robert Griesemer)三位业界知名的大师级人物。以下是这三位开发者的简要...

    go语言编程,Go语言程序设计(英文版),学习 Go 语言(Golang),golang-china读书笔记

    Go语言,也被称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。自2009年发布以来,Go语言因其简洁的语法、高效的性能以及对并发编程的良好支持,受到了广大开发者的欢迎...

    Go语言中文文档高清版

    Go语言中文文档高清版 Go语言中文文档高清版是Go语言的官方文档,涵盖了Go语言的基本概念、语法、标准库、框架、数据库、网络编程、并发编程、微服务等方面的知识点。 一、基本概念 * Go语言的主要特征:静态类型...

    Go语言15套教程(百度网盘)

    - **并发模型**:深入理解Go语言的并发模型,包括goroutine和channel的使用技巧。 - **内存管理**:探讨Go语言中的垃圾回收机制及其对性能的影响。 - **错误处理**:介绍Go语言特有的错误处理方式,如使用error类型...

    谷歌 GO 语言 教程 PDF

    谷歌的Go语言,也被称为Golang,是由Google在2009年推出的一种开源编程语言。它被设计为简洁、高效、并发性好,并且具有内置的垃圾回收机制,使得开发人员可以更专注于编写可维护的代码。这个“谷歌GO语言教程PDF”...

    20小时入门学会go语言.docx

    1. 并发原生支持:Go语言通过goroutine和channel实现了轻量级线程,使得并发编程变得简单高效。 2. 垃圾回收(GC):Go语言内建了垃圾回收机制,自动管理内存,减轻了程序员的工作负担。 3. 动态和静态的结合:虽然...

    Go语言实战_golang教程_Go_go_

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的、C风格的编程语言。它旨在提高编程效率,简化系统编程,并且能够支持大规模的网络服务和分布式计算。Go语言实战教程是学习Go...

    golang基础教程-go语言快速入门.zip

    Go语言,又称Golang,是Google在2009年推出的一种开源编程语言,由罗伯特·格瑞史莫、罗布·派克和肯特·贝克等大神设计。Go语言的设计目标是简单、高效、安全,特别适合构建网络服务和并发程序。它吸收了C语言的...

    go 语言 入门

    Go语言,通常被称为Golang,是由Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。它具有简洁、快速、安全和现代的特点。Go语言设计团队的初衷是为了让编程更加简单、高效,同时能够应对...

    go语言实战 中文 完整版 带书签

    《Go语言实战》是一本深度剖析Go语言的书籍,它以中文的形式呈现,共计240页,并且配备了详尽的书签,便于读者查阅和学习。...书中的实例和实战经验将帮助你更好地运用Go语言,提升你的编程技能和效率。

Global site tag (gtag.js) - Google Analytics