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)
}

总之,两种方案都试试吧。

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