channel定义
make(chan Type) //等价于make(chan Type, 0),无缓冲channel
make(chan Type, capacity) //capacity,缓冲值
channel使用
channel <- value //传递值给channel
<-channel //接收channel值,并丢弃
x := <-channel //接收搜channel值
x,ok := <-channel //接收channel值,同时检查channel是否结束或为空
无缓冲channel
有缓冲channel
关闭channel
package main
import (
"fmt"
)
func main() {
channel := make(chan int, 2)
//创建一个goroutine
go func() {
defer fmt.Println("goroutine 结束")
for i := 0; i < 4; i++ {
channel <- i
fmt.Println("goroutine 开始存值", i)
}
close(channel)
}()
for {
//同上功能,但会检查返回的channel值是否为空或传递是否结束
if v, ok := <-channel; ok {
fmt.Println("接收完成", v)
}else{
break
}
}
fmt.Println("main结束")
}
channel与range
package main
import (
"fmt"
)
func main() {
channel := make(chan int, 2)
//创建一个goroutine
go func() {
defer fmt.Println("goroutine 结束")
for i := 0; i < 4; i++ {
channel <- i
fmt.Println("goroutine 开始存值", i)
}
close(channel)
}()
for v := range channel {
fmt.Println("接收完成", v)
}
fmt.Println("main结束")
}
channel与select
单流程在channel只能监听一个channel状态,select可以监听多个channel状态,如果多个case同时满足会随机选择一个执行,当select无case时会阻塞
package main
import "fmt"
func test(channel1, channel2 chan int) {
x, y := 1, 1
for {
select {
case channel1 <- x:
x = y
y = x + y
case <-channel2:
fmt.Println("quit")
return
}
}
}
func main() {
channel1 := make(chan int)
channel2 := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-channel1)
}
channel2 <- 0
}()
test(channel1,channel2)
}
实现work_pool
package main
import (
"fmt"
"time"
)
func work(i int, jobs <-chan int, results chan<- int) {
for job := range jobs {
fmt.Println("work", i, "start")
results <- job * 2
fmt.Println("work", i, "end")
time.Sleep(1*time.Second)
}
}
func main() {
jobs := make(chan int, 10)
results := make(chan int, 10)
for i := 0; i < 3; i++ {
go work(i, jobs, results)
}
for i := 0; i < 5; i++ {
jobs <- i
}
for i := 0; i < 5; i++ {
<-results
}
}