无缓冲channel
channel使用注意点
- channel在<-ch没获取到值后,会阻塞掉,直到从ch中拿到值
- 循环从channel取值时不明确一共可以接收多少次就需要 协程
close(ch)告诉什么时候channel传值结束
- 循环从channel取值时明确一共可以接收多少次,协程中就不用
close(ch)
- 无缓冲channel传值前必须有接受值的,否则向channel传入就会造成死锁
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
go unbufferChan(ch)
for i := 0; i < 10; i++ {
fmt.Println("receive ", <-ch)
}
}
func unbufferChan(ch chan int) {
for i := 0; i < 10; i++ {
fmt.Println("send ", i)
time.Sleep(time.Second)
ch <- i
}
}
有缓冲channel
channel使用注意点
ch := make(chan int, 2)
ch <- 1
ch <- 2
fmt.Println(<-ch)
fmt.Println(<-ch)
ch := make(chan int, 2)
ch <- 0
ch <- 1
close(ch)
for i := 0; i < cap(ch)+1; i++ {
v, ok := <-ch
fmt.Println(v, ok)
}
channel := make(chan struct{})
go func() {
channel <- struct{}{}
}()
fmt.Println(<-channel)