Golang channel 使用總結(一)

無緩衝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)
}

總之,兩種方案都試試吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章