深入理解golang chan的使用攻略
什么是chan
chan(channel)是Golang中的一种并发原语,主要用于在 goroutine 之间传递数据和信号,它起到了 goroutine 通信的桥梁作用。chan 是一种类型,可以通过 make 函数初始化。
chan的创建和初始化
chan 的创建和初始化使用make
函数,其语法如下:
ch := make(chan valueType)
其中,valueType 为 chan 中编写的类型。通常,chan 分为同步的和异步的两种模式。同步的 chan 会等待数据的接收方去取数据,在发送方将数据发送到 chan 里后,将其阻塞直到对应的 goroutine 取出数据。而异步通道不会等待,发送方将数据发送到 chan 后,立刻继续执行,不阻塞。
chan的基本操作
chan 实例作为一个变量,可以进行一些基本操作。如:
- 发送数据:使用
<-
操作符向 chan 中推入一条数据。 - 接收数据:使用
<-
操作符从 chan 中取出一条数据,如果 chan 中没有数据可取,则该操作阻塞,直到有数据可取。 - 关闭 chan:使用 close 函数来关闭 chan。
示例一:同步 chan
下面是同步 chan 的一个示例,当缓冲区为空时,读取操作会被阻塞。
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
ch <- 10
}()
v := <- ch
fmt.Println("The value received from the channel is", v)
}
在这个示例中,首先创建了一个 chan 变量,使用了make
来初始化。然后,使用匿名函数发送值。匿名函数会在一个新的 goroutine 中启动,并将10
的值发送到 chan 中。最后,接收 goroutine 阻塞在了等待 chan 接收数据的语句。
示例二:异步 chan
下面我们来看一个异步 chan 的示例。在这个示例中,无缓冲区 chan 不会阻塞,发送操作会直接输出,然后继续执行。
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
ch <- 10
fmt.Println("value is sent")
}()
fmt.Println("waiting for value")
v := <- ch
fmt.Println("The value received from the channel is", v)
}
在这个示例中,首先创建了一个 chan 变量,使用make
来初始化。接着,使用匿名函数启动了一个新 goroutine,向 chan 中发送值,并输出"values is sent"。异步 channel 不会等待,所以输出语句直接执行,然后执行接收操作,等待从 chan 中取出发送的值。输出的第三行是最后的结果,它和第二行并列输出。
总结
可以看出,chan 是 Golang 中一个非常重要和强大的并发原语。我们可以通过 chan 在不同的 goroutine 之间进行通讯。另外,在使用 chan 时,需要注意的是场景,及其传输数据的类型,避免出现类型不兼容造成程序崩溃的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解golang chan的使用 - Python技术站