对已经关闭的的 chan 进行读写,会怎么样?为什么?
package main
func main() {
ch := make(chan int, 3)
close(ch)
ch <- 1
}
panic: send on closed channel
goroutine 1 [running]:
main.main()
D:/goproject/src/github.com/leetcode/test.go:6 +0x452. 读已经关闭的 chan
进程 已完成,退出代码为 2
package main
import "fmt"
func main() {
fmt.Println("以下是数值chan")
c1 := make(chan int, 3)
c1 <- 1
close(c1)
num, ok := <-c1
fmt.Printf("num=%v,ok=%v", num, ok)
num1, ok1 := <-c1
fmt.Printf("num1=%v,ok1=%v", num1, ok1)
num2, ok2 := <-c1
fmt.Printf("num2=%v,ok2=%v", num2, ok2)
fmt.Println("以下是字符串的chan")
c2 := make(chan string, 3)
c2 <- "abc"
close(c2)
str, ok := <-c2
fmt.Printf("str=%v,ok=%v", str, ok)
str1, ok1 := <-c2
fmt.Printf("str1=%v,ok1=%v", str1, ok1)
str2, ok2 := <-c2
fmt.Printf("str2=%v,ok2=%v", str2, ok2)
}
num=1,ok=true
num1=0,ok1=false
num2=0,ok2=false
str="abc",ok=true
str1="",ok1=false
str2="",ok2=false
//src/runtime/chan.go/chansend
if c.closed != 0 {
unlock(&c.lock)
panic(plainError("send on closed channel"))
}
当 c.closed != 0 则为通道关闭,此时执行写,源码提示直接 panic,输出的内容就是上面提到的 "send on closed channel"。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。