一句话总结:ch := make(chan int) 由于没有缓冲发送和接收需要同步,ch := make(chan int, 2) 有缓冲不要求发送和接收操作同步。
1、无缓冲时,发送阻塞直到数据被接收,接收阻塞直到读到数据
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
go func() {
var sum int = 6
fmt.Println("first send")
ch <- sum
fmt.Println("second send start")
fmt.Println("second send")
ch <- sum
}()
time.Sleep(1e9)
fmt.Println("first recv")
fmt.Println(<-ch)
fmt.Println("second recv")
fmt.Println(<-ch)
}
first send
first recv
6
second recv
second send start
second send
6
2、有缓冲时,当缓冲满时发送阻塞,当缓冲空时接收阻塞
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int, 2)
go func() {
var sum int = 6
fmt.Println("first send")
ch <- sum
fmt.Println("second send start")
time.Sleep(1e9)
fmt.Println("second send")
ch <- sum
fmt.Println("third send start")
time.Sleep(1e9)
fmt.Println("third send")
ch <- sum
time.Sleep(1e9)
fmt.Println("forth send")
ch <- sum
}()
time.Sleep(6e9)
fmt.Println("first recv")
fmt.Println(<-ch)
fmt.Println("second recv")
fmt.Println(<-ch)
fmt.Println("third recv")
fmt.Println(<-ch)
fmt.Println("forth recv")
fmt.Println(<-ch)
}
first send
second send start
second send
third send start
third send
first recv
6
second recv
6
third recv
6
forth recv
forth send
6