从接收通道阻塞

我有以下 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....")

}

认为我做的一切都是正确的。有人可以帮我调试这个挂起的代码吗?


鸿蒙传说
浏览 178回答 1
1回答

神不在的星期二

我认为这是因为您的escape1for 循环包装了for scanner.Scan()循环。当我删除那个外部 for 循环时,它对我来说很好用:https : //play.golang.org/p/NU3m3Deil7func main() {&nbsp; &nbsp; var (&nbsp; &nbsp; &nbsp; &nbsp; donec&nbsp; = make(chan struct{})&nbsp; &nbsp; &nbsp; &nbsp; stream = make(chan string, 5000)&nbsp; &nbsp; &nbsp; &nbsp; exitc&nbsp; = make(chan struct{})&nbsp; &nbsp; )&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; scanner := bufio.NewScanner(strings.NewReader(lines))&nbsp; &nbsp; escape1:&nbsp; &nbsp; &nbsp; &nbsp; for scanner.Scan() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case <-donec:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("escape1")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close(stream)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break escape1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; stream <- scanner.Text()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; close(exitc)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("scan done")&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; }()escape2:&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case txt, ok := <-stream:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if !ok {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("stream closed!")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(txt)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if strings.Contains(txt, "line5") {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close(donec)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <-exitc&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break escape2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; fmt.Println("done....")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go