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 mainimport ("fmt")func main() {channel := make(chan int, 2)//创建一个goroutinego func() {defer fmt.Println("goroutine 结束")for i := 0; i < 4; i++ {channel <- ifmt.Println("goroutine 开始存值", i)}close(channel)}()for {//同上功能,但会检查返回的channel值是否为空或传递是否结束if v, ok := <-channel; ok {fmt.Println("接收完成", v)}else{break}}fmt.Println("main结束")}
channel与range
package mainimport ("fmt")func main() {channel := make(chan int, 2)//创建一个goroutinego func() {defer fmt.Println("goroutine 结束")for i := 0; i < 4; i++ {channel <- ifmt.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 mainimport "fmt"func test(channel1, channel2 chan int) {x, y := 1, 1for {select {case channel1 <- x:x = yy = x + ycase <-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 mainimport ("fmt""time")func work(i int, jobs <-chan int, results chan<- int) {for job := range jobs {fmt.Println("work", i, "start")results <- job * 2fmt.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}}
