无缓冲channel的使用
package main
import "fmt"
func main() {
ch := make(chan string)
ch <- "hello golang"
fmt.Println(<-ch)
}
运行结果:
[@hbhly_56_128 demo]$ go run g.go
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/search/odin/gaozhenan/git/demo/g.go:7 +0x59
exit status 2
[@hbhly_56_128 demo]$
原因分析
在我们 make channel的时候,若不传递第二个参数,定义的是无缓冲channel,对于无缓冲channel,在没有提前准备好接收方时,发送操作是阻塞的。
修正
- 接收方提前到位
package main
import "fmt"
func main() {
ch := make(chan string)
// 这里为什么用Go程呢, 因为如果不用Goroutine,那么接收和发送就在一个Goroutine了, 接收也是会阻塞的吆~
go func() {
fmt.Println(<-ch)
}()
ch <- "hello golang"
}
- 使用有缓冲channel
package main
import "fmt"
func main() {
ch := make(chan string, 1)
ch <- "hello golang"
fmt.Println(<-ch)
}
总之,两种方案都试试吧。