为了账号安全,请及时绑定邮箱和手机立即绑定

在 go Channel 中尝试 Range 和 Close

在 go Channel 中尝试 Range 和 Close

Go
当年话下 2022-05-23 16:58:51
我正在尝试在频道中使用范围和关闭来更好地理解它。以下是我根据自己的理解尝试的代码示例。执行下面的代码后,我得到代码下面提到的错误。代码:package mainimport (    "fmt")func main() {    str := "hello"    hiChannel := make(chan string, 5)    for j := 1; j <= 5; j++ {        go func(hi string) {            hiChannel <- hi        }(str)    }    defer close(hiChannel)    for s := range hiChannel {        fmt.Println(s)    }}错误:go run restsample/restsample.gohellohellohellohellohellofatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.main()        C:/Users/Indian/personal/Workspaces/Learning/src/restsample/restsample.go:16 +0x169exit status 2
查看完整描述

2 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

for s := range hiChannel

当您关闭 for 语句时退出hiChannel,实际上您并没有关闭通道,因此,您的代码会引发死锁。
有几种方法可以关闭通道,例如,您可以计算打印了多少字符串,然后您可以关闭通道。
或者,您可以创建一个信号通道并在收到所有必要信息后关闭。


查看完整回答
反对 回复 2022-05-23
?
茅侃侃

TA贡献1842条经验 获得超21个赞

根据@Tinwor 的反馈,我尝试添加几行来检查消息计数并且它有效。谢谢。


package main


import (

    "fmt"

)


func main() {

    str := "hello"

    hiChannel := make(chan string, 5)

    for j := 1; j <= 5; j++ {

        go func(hi string) {

            hiChannel <- hi

        }(str)

    }

    i := 1

    for s := range hiChannel {

        i++

        if i == 5 {

            fmt.Println(s)

            close(hiChannel)

        } else {

            fmt.Println(s)

        }

    }

}


查看完整回答
反对 回复 2022-05-23
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信