Golang channel 使用总结(二)

有缓冲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

你可能感兴趣的:(Golang)