channel的基本概念和语法
- 声明一个channel
var ch chan int //声明一个int类型的channel,零值为nil
ch = make(chan int) // 创建一个int类型的channel,返回一个channel值
ch := make(chan int) // 声明并创建一个int类型的的channel
- 缓冲
ch1 := make(chan int) //无缓冲
ch2 := make(chan int, 10) //有缓冲
ch2 <- 1 //正常运行
ch1 <- 1 // fatal error: all goroutines are asleep - deadlock!
- 发送和接收操作
ch := make(chan int64)
go func() {
n := <-ch
fmt.Println("Received n=", n)
}()
ch <- 42
fmt.Println("Sent ", 42)
- 关闭channel
ch := make(chan int64)
go func() {
for {
n, ok := <-ch
if !ok {
fmt.Println("channel closed")
break
}
fmt.Println("Received:", n)
}
}()
ch <- 11
ch <- 22
close(ch)
fmt.Println("close the channel")
- 注意:关闭channel并不会影响从channel中接收已经发送的数据,只是不能再发送数据
- channel的方向
func send(ch chan<- int64, num int64) {
ch <- num
}
func receive(ch <-chan int64) int64 {
return <-ch
}
func main() {
var num int64 = 100
ch := make(chan int64)
go send(ch, num)
fmt.Println("Received", receive(ch))
}
channel的特性和原理
channel的最佳实践
channel的高级用法
~待补充