package main import "fmt" /* 管道Channel是goroutine间的通讯方式,可以使用channel在多个goroutine之间传递消息 golang的并发模型是CSP,提倡通过通信共享内存,而不是通过共享内存实现通信 1.管道的类型,是引用数据类型 2.如果创建管道的时候没有指定容量,那么这个管道就是无缓冲的管道,由称为阻塞管道 3.如果管道满了,你还往管道存储数据,会报deadlock错 4.在没有使用协程的情况下,如果我们的管道数据已经全部取出,再取就会报deadlock错, */ func main() { // 创建管道 ch:= make(chan int, 3) // 给管道里存数据 ch<-10 ch<-20 ch<-30 //从管道里取值 a:=<- ch fmt.Println(a) //10 <-ch c:=<-ch fmt.Println(c) //30 fmt.Printf("值:%v 容量:%v 长度:%v\n", ch, cap(ch),len(ch)) //值:0x820238000 容量:3 长度:0 //使用for range遍历管道,当管道被关闭的时候就会退出for range,如果没有关闭管道就会报错 //all goroutines are asleep - deadlock! var ch1 = make(chan int ,10) for i:=1;i<=10;i++{ ch1<-i } close(ch1) //关闭管道 //注意管道没有key for v := range ch1{ fmt.Println(v) } //注意:通过for循环遍历管道可以不关闭管道,for range遍历必须关闭,否则报错 var ch2 = make(chan int ,10) for i:=1;i<=10;i++{ ch2<-i } // close(ch1) //关闭管道 for i:=1;i<=10;i++{ fmt.Println(<-ch2) } }
package main import "fmt" import "sync" import "time" /* goroutine结合channel协同工作,定义两个方法,一个方法给管道写数据,一个从管道里读数据 管道是安全的:如果一个管道读取数据的速度比写入数据的速度快,读取不会报错 */ var wg sync.WaitGroup func fn1(ch chan int){ for i:=1;i<=10;i++{ ch<-i fmt.Printf("写入数据%v成功\n", i) time.Sleep(time.Millisecond*10) //为了看出交替执行的效果 } close(ch) wg.Done() } func fn2(ch chan int){ for v := range ch{ fmt.Printf("读取数据%v成功\n", v) time.Sleep(time.Millisecond*10) //为了看出交替执行的效果 } wg.Done() } func main() { var ch = make(chan int, 10) wg.Add(1) go fn2(ch) wg.Add(1) go fn1(ch) wg.Wait() }
相关推荐
管道(channel)是Go语言中用于goroutine间通信的一种机制。它提供了一种安全的方式来在不同的goroutine之间传递数据。通过使用channel,可以有效地协调goroutine之间的数据交换,从而避免了复杂的同步问题。 #####...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。自2009年发布以来,Go语言因其简洁、高效的语法和强大的并发处理能力,逐渐在云计算、微服务、容器等领域获得了广泛...
Go语言支持C风格的语法,同时引入了诸如goroutine(轻量级线程)和channel(通信机制)等特性,使得并发编程变得简单而高效。Go语言的垃圾回收机制则减轻了程序员管理内存的负担,增加了代码的安全性。 在《Go语言...
4. **并发编程**:这是Go语言的一大特色,笔记会详细解释goroutine(轻量级线程)和channel(通信机制)的概念,以及如何通过它们实现高效的并发操作。 5. **指针与内存管理**:讲解Go语言中的指针操作和内存管理,...
Go语言的goroutine和channel等概念允许开发者用极小的代码量就能编写出高度并发的程序。Go语言还提供了内置的并发安全的类型和函数,比如sync包中的Mutex、WaitGroup等,这使得在多线程环境下进行数据同步和线程间...
Go语言,也被称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。自2009年发布以来,Go语言因其简洁的语法、高效的性能以及对并发编程的良好支持,受到了广大开发者的欢迎...
- Go语言采用自动内存管理和垃圾回收机制,开发者无需手动管理内存释放,提高了编程效率。 - **程序测试**: - Go语言内置了强大的测试框架,支持单元测试、基准测试等多种测试类型。 - **Web应用开发**: - ...
在这里,我们也可以看到,Go语言的goroutine和channel机制使得并发编程变得非常简单。我们可以轻松地编写高性能的并发程序,而不需要担心线程同步和死锁的问题。 因此,Go语言是一种非常适合现代网络编程和分布式...
Go语言源码剖析的主要内容涉及Golang运行时内部执行机制的深入解析。这包括但不限于以下几个关键方面: 1. 内存分配机制:Go语言的内存分配机制是理解其性能的关键。文档中提到内存分配包含初始化、分配、回收、...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的、C风格的编程语言。它旨在提高编程效率,简化系统编程,并且能够支持大规模的网络服务和分布式计算。Go语言实战教程是学习Go...
Go语言,又称Golang,是Google在2009年推出的一种开源编程语言,由罗伯特·格瑞史莫、罗布·派克和肯特·贝克等大神设计。Go语言的设计目标是简单、高效、安全,特别适合构建网络服务和并发程序。它吸收了C语言的...
- **goroutine交互**:Go语言通过channel来实现goroutine之间的通信。通过向channel发送数据或从channel接收数据,可以实现实现goroutine间的同步和数据交换。 #### 五、错误处理机制 - **Go错误处理范式**:Go...
同时,goroutine的非抢占式调度和内置的channel通信机制,使得Go语言在并发编程中表现出色,降低了死锁和竞态条件等并发问题的出现概率。对于想要学习并发编程或者优化现有系统的开发者来说,理解和掌握goroutine是...
Go语言的显著特性包括并发机制、垃圾回收、丰富的标准库和简洁的语法。 Go语言由Rob Pike、Robert Griesemer、Ken Thompson等人设计,于2007年首次公布,并在2009年11月正式发布1.0版本。它被设计得易于学习,同时...
《Go语言四十二章经》是一本深入探讨Go语言编程的资源,主要针对Go语言在服务器编程、网络编程,特别是Web应用、API应用以及分布式系统中的应用。Go语言,也称为Golang,是由Google开发的一种静态类型、编译型、并...
Go语言,又称Golang,是Google推出的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。Go语言以其简洁的语法、高效的性能和内置的并发支持,在网络编程领域得到了广泛应用。本资料包提供了基于Go语言实现...
Go语言中的goroutine和channel是其并发编程的核心,goroutine轻量级线程使得大量并发执行变得轻松,而channel则提供了一种安全的数据通信机制,避免了传统多线程编程中的锁竞争问题。 本教程的"Go语言编程基础"可能...
Go语言,又称为Golang,是由Google开发的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。它设计的目标是提高开发者的生产效率,同时提供高效的系统编程能力。 Go语言的特点: 1. **简洁性**:Go语言的...