golang并发编程之channel
通道由make函数创建,该函数指定chan关键字和通道的元素类型
创建无缓冲和缓冲通道的代码块:
语法:
Unbuffered := make(chan int) //整型无缓冲通道
buffered := make(chan int,10) //整型有缓冲通道
将值发送给通道的代码块需要使用 <- 运算符
goroutine1 := make(chan string,5) // 字符串缓冲通道
goroutine1 <- "China" //通过通道发送字符串
从通道接受值的代码块
data := <- goroutine1 //从通道接受字符串
通道的发送和接收特性
1.对于同一个通道,发送操作之间是互斥的,接受操作之间也是互斥的。
2.发送操作和接受操作对元素的处理是不可分割的。
3.发送操作在完成之前会被阻塞,接受操作也是如此
实例
package main
import (
"fmt"
"math/rand"
"time"
)
var values = make(chan int)
func send() {
rand.Seed(time.Now().UnixNano())
// 生成一个10以内的随机数
value := rand.Intn(10)
fmt.Printf("value: %v\n", value)
// 等待两秒
time.Sleep(time.Second * 2)
values <- value
}
func main() {
// 从通道接受值
defer close(values)
go send()
fmt.Println("wait...")
value := <-values
fmt.Printf("recieve: %v\n", value)
fmt.Println("end...")
}
Output:
wait...
value: 2
recieve: 2
end...