无缓存
ch := make (chan int) 等价于 ch := make (chan int, 0)
无缓存的channel,如果想要写入值,但没有人读的话,写的值会一直写不进去(阻塞在写入处)。直到有人读取,才会写入,并传递到读出的数那里。
package main
import (
"fmt"
"time"
)
var ch chan int
// 写chan
func writech(){
ch <- 1
fmt.Println("writech end")
}
func main(){
ch = make (chan int, 0)
go writech()
time.Sleep(2 * time.Second)
// 读chan
fmt.Println("start to read chan")
<-ch
time.Sleep(time.Second)
fmt.Println("end main")
}
有缓存
缓冲满了之后阻塞,除非有人对它操作(读)
package main
import (
"fmt"
"time"
)
var ch chan int
// 写chan
func writech(){
ch <- 1
fmt.Println("writech 1")
ch <- 2
fmt.Println("writech 2")
ch <- 3
fmt.Println("writech 3, end")
}
func main(){
ch = make (chan int, 2)
go writech()
time.Sleep(2 * time.Second)
// 读chan
fmt.Println("start to read chan")
<-ch
fmt.Println("chan read end")
time.Sleep(time.Second)
fmt.Println("end main")
}