golang 系列:channel 全面解析
channel 是 goroutine 与 goroutine 之间通信的重要桥梁,帮助我们轻松编写多协程通信程序。本文将全面解析 channel 的概念、使用、底层原理。channel 的概念在于,它是一种用于端到端数据传输的通道,类似于消息队列,但用于 goroutine 之间的通信。每个 channel 都是 goroutine 的内存级通信媒介,支持 goroutine 对象间的双向数据交换。goroutine 是轻量级的协程,拥有独立的栈空间,性能开销小,采用用户态调度模型。传统线程间通信方式如内存共享、信号量等,在 channel 模型中被抽象为通信层,实现数据共享。channel 保证协程安全,遵循 FIFO 特性,先发送的数据先被接收,先执行读取的 goroutine 先获取数据。使用 channel 可能引起 Go runtime 调度,产生阻塞和唤起 goroutine
golang为什么设计channel?
Channels,或称为Go的通道,是协程间通信的机制。它们允许一个协程向另一个协程发送数据。每个通道都需要指定数据类型,如 chan int。数据传输如同水在管道中流动。相对于传统线程通过共享内存通信,Go语言推崇使用通道而非共享内存。这意味着,Go语言通过数据传递实现共享内存,而非共享内存实现消息传递。创建通道类型需遵循语法:var channel变量 chan channel类型。通道是引用类型,需配合make创建。创建语法:channel示例 := make(chan 数据类型)。实例如下:ch1 := make(chan int) 创建整数类型通道;ch2 := make(chan interface{}) 创建任意数据类型的空接口通道;ch3 := make(chan *Equip) 创建Equip指针类型的通道。通道发送数据使用"<-"操作符。发送格式:channel变量 <-
浅析Golang的固定时长定时器和周期性时长定时器
浅析Golang的固定时长定时器和周期性时长定时器我们之前要想在调度里面实现延时执行,我们可以使用管道阻塞,直到有人往管道里面写东西才变通畅,还可以使用sleep来睡觉,但是睡觉的过程,协程啥也干不了也占用资源。所以我们要用到接下来讲的定时器,不会像sleep那样睡的时候也占用资源。先来看看下面这段代码:packagemainimport("fmt""time")funcmain(){timer:=time.NewTimer(3*time.Second)fmt.Println("定时器创建完毕!")fmt.Println(time.Now())//阻塞3秒后才能读出时间x:=<-timer.C//这个C是一个单向的只读管道fmt.Println(x)}运行结果是这样的:定时器创建完毕!2021-08-2414:02:28.6664158+0800CSTm=+0.0129976012021-08-2414:02:31