[英]Go blocking from receiving channel
我有以下 go 代码来等待流。 预期的输出是:
line1
line2
line3
line4
line5
escape1
scan done
done....
但是在line5
之后,我的代码一直挂着。
var lines = `
line1
line2
line3
line4
line5
line6
line7
`
func main() {
var (
donec = make(chan struct{})
stream = make(chan string, 5000)
exitc = make(chan struct{})
)
go func() {
scanner := bufio.NewScanner(strings.NewReader(lines))
escape1:
for {
for scanner.Scan() {
select {
case <-donec:
fmt.Println("escape1")
close(stream)
break escape1
default:
stream <- scanner.Text()
}
}
}
close(exitc)
fmt.Println("scan done")
return
}()
escape2:
for {
select {
case txt, ok := <-stream:
if !ok {
fmt.Println("stream closed!")
}
fmt.Println(txt)
if strings.Contains(txt, "line5") {
close(donec)
<-exitc
break escape2
}
}
}
fmt.Println("done....")
}
认为我做的一切都是正确的。 有人可以帮我调试这个挂起的代码吗?
谢谢!
我认为这是因为您的escape1
for 循环包装了escape1
for scanner.Scan()
循环。
当我删除那个外部 for 循环时,它对我来说很好用: https : //play.golang.org/p/NU3m3Deil7
func main() {
var (
donec = make(chan struct{})
stream = make(chan string, 5000)
exitc = make(chan struct{})
)
go func() {
scanner := bufio.NewScanner(strings.NewReader(lines))
escape1:
for scanner.Scan() {
select {
case <-donec:
fmt.Println("escape1")
close(stream)
break escape1
default:
stream <- scanner.Text()
}
}
close(exitc)
fmt.Println("scan done")
return
}()
escape2:
for {
select {
case txt, ok := <-stream:
if !ok {
fmt.Println("stream closed!")
}
fmt.Println(txt)
if strings.Contains(txt, "line5") {
close(donec)
<-exitc
break escape2
}
}
}
fmt.Println("done....")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.