8. 并发

8.1 goroutine

为一个普通函数创建 goroutine 的写法如下:

go 函数名(参数列表) // 返回值会被忽略

使用匿名函数创建 goroutine 的格式

go func(参数列表) {
    函数体
}(调用参数列表)

8.2 chan

Go语言提倡使用通信的方法代替共享内存,当一个资源需要在 goroutine 之间共享时,通道在 goroutine 之间架起了一个管道,并提供了确保同步交换数据的机制。

// 声明一个 int 类型的通道
var chInt chan int
// 创建一个空接口通道
ch := make(chan interface{})
// 创建一个 3 个元素缓冲大小的整型通道
ch := make(chan int, 3)
// 将0放入通道中
ch <- 0
// 将hello字符串放入通道中
ch <- "hello"
// 阻塞接收数据
data := <-ch
// 非阻塞接收数据
data, ok := <-ch
// 接收任意数据,忽略接收的数据
<-ch
// 循环接收
for data := range ch {
    ...
}

// 声明一个只能发送的通道类型, 并赋值为ch
var chSendOnly chan<- int = ch
// 声明一个只能接收的通道类型, 并赋值为ch
var chRecvOnly <-chan int = ch
// 创建一个只能接收的通道类型,不能发送只能接收的通道是毫无意义的
ch := make(<-chan int)

// 关闭通道
close(ch)
// ok 为 false 表示已关闭
x, ok := <-ch

8.3 select

Go 语言中提供了 select 关键字,可以同时响应多个通道的操作。

select {
case <-ch: // 接收任意数据
    ...
case d := <-ch: // 接收变量
case ch <- 100: // 发送数据
default: // 没有操作情况
}

8.4

results matching ""

    No results matching ""