無緩衝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)
}
總之,兩種方案都試試吧。