golang channel关闭后能正常读写吗

1. channel关闭后读操作

关闭channel后,已经写入的正常读取完,继续读的话是类型的零值(int类型的话就是0)

package main

import "fmt"

func main() {

	ch := make(chan int, 3)

	for i := 0; i < 3; i++ {
		ch <- i
	}

	close(ch)

	for i := 0; i < 4; i++ {
		value := <-ch
		fmt.Println("value:", value) 
	}

}

输出:

value: 0
value: 1
value: 2
value: 0

 2. channel关闭后写操作

会报panic: send on closed channel

package main

func main() {

	ch := make(chan int, 3)

	for i := 0; i < 3; i++ {
		ch <- i
	}

	close(ch)

	ch <- 4

}

输出:

panic: send on closed channel
// ...

看下运行时源码runtime/chan.go

func chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool {

    // ...
	if c.closed != 0 {
		unlock(&c.lock)
		panic(plainError("send on closed channel"))
	}

	// ..
}

3. channel关闭后再次关闭

panic: send on closed channel

package main

func main() {

	ch := make(chan int, 3)

	for i := 0; i < 3; i++ {
		ch <- i
	}
	close(ch)
	close(ch)
}

输出

panic: send on closed channel

// ...

看下运行时源码runtime/chan.go

func closechan(c *hchan) {
	//...
	if c.closed != 0 {
		unlock(&c.lock)
		panic(plainError("close of closed channel"))
	}
    // ...
}

猜你喜欢

转载自blog.csdn.net/qq2942713658/article/details/132503865
今日推荐