golang:为什么chan关闭了也无法接受到内容呢?
go代码如下:
实际程序死锁。
有人问,chan close后不会可以被读取到了吗?
但是实际程序运行到:
ch <- 1
这里, 已经被阻塞,导致报错,无法接下来的close操作。
加入打印信息:
实际只打印到start, next那个已经不输出了。
正确的修改:
创建了一个免费的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知识星球社区,欢迎加入一起讨论吧