golang:为什么chan关闭了也无法接受到内容呢?

go代码如下:
   package main                                                                                                                        

import "fmt"

func main() {
ch := make(chan int)
ch <- 1
close(ch)
n, ok := <-ch
if !ok {
fmt.Println("Error")
}
fmt.Println(n)
var input string
fmt.Scanln(&input)
}
 
实际程序死锁。
 
有人问,chan close后不会可以被读取到了吗?
 
但是实际程序运行到:
ch <- 1
这里, 已经被阻塞,导致报错,无法接下来的close操作。
 
加入打印信息:
package main

import "fmt"

func main() {
ch := make(chan int)
fmt.Println("start")
ch <- 1
fmt.Println("next")
close(ch)
n, ok := <-ch
if !ok {
fmt.Println("Error")
}
fmt.Println(n)
var input string
fmt.Scanln(&input)
}

实际只打印到start, next那个已经不输出了。
:!go run channel_close.go                                                                                                               
start
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
/home/admin/git/GolangLearning/helloworld/channel/channel_close.go:8 +0xa8
exit status 2

shell returned 1

正确的修改:
package main

import "fmt"

func main() {
ch := make(chan int)
go func() {
fmt.Println("start")
ch <- 1
fmt.Println("next")
close(ch)
}()
n, ok := <-ch
if !ok {
fmt.Println("Error")
}
fmt.Println(n)
var input string
fmt.Scanln(&input)
}

 
创建了一个免费的Go知识星球社区,欢迎加入一起讨论吧


 

0 个评论

要回复文章请先登录注册