有缓冲channel的关闭
dead lock
如果 在同一个Goroutine内,发送数大于缓冲数,就跟无缓冲类似了。
package main
import "fmt"
func main() {
pipline := make(chan string, 1)
pipline <- "hello world"
pipline <- "hello Golang"
close(pipline)
for i := 0; i < 5; i++ {
fmt.Printf("%d-%s,x\n", i, <-pipline)
}
}
运行结果
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/search/odin/gaozhenan/git/demo/g.go:8 +0x81
exit status 2
close后再接收到是什么呢?
package main
import "fmt"
func main() {
pipline := make(chan string, 1)
go func() {
pipline <- "hello world"
pipline <- "hello Golang"
close(pipline)
}()
for i := 0; i < 5; i++ {
fmt.Printf("%d-%s,x\n", i, <-pipline)
}
}
运行结果
[@hbhly_56_128 demo]$ vi g.go
[@hbhly_56_128 demo]$ go run g.go
0-hello world,x
1-hello Golang,x
2-,x
3-,x
4-,x
[@hbhly_56_128 demo]$
如果是 chan int
呢?
package main
import "fmt"
func main() {
pipline := make(chan int, 1)
go func() {
pipline <- 1
pipline <- 2
close(pipline)
}()
for i := 0; i < 5; i++ {
fmt.Printf("%d-%d,x\n", i, <-pipline)
}
}
运行结果
0-1,x
1-2,x
2-0,x
3-0,x
4-0,x