【问题标题】:Is it necessary to close a channel when sending data is finished?发送数据完成后是否需要关闭通道?
【发布时间】:2021-03-10 19:46:47
【问题描述】:

这是我的程序。

package main

import "fmt"

func init() {
    fmt.Println("init function")
}

func main() {
    // gen number to naturals channel
    naturals := gen(1, 2, 3)
    // write the squars in a channel
    squar := dosquar(naturals)

    for p := range squar {
        fmt.Println("printer shows----- ", p)
    }
}

func gen(nums ...int) chan int {
    naturals := make(chan int)
    go func() {
        for _, n := range nums {
            fmt.Println("generating number ", n)
            naturals <- n
            fmt.Println("generated number ", n)
        }
        //close(naturals)
    }()
    return naturals
}

func dosquar(naturals chan int) chan int {
    // write the squars the values
    squar := make(chan int)
    go func() {
        for number := range naturals {
            fmt.Println("recieved number ", number)
            squar <- number * number
            fmt.Println("sent squar of number ", number*number)
        }
        //close(squar)
    }()
    return squar
}

它给出以下错误。

init function
generating number  1
generated number  1
generating number  2
recieved number  1
sent squar of number  1
recieved number  2
generated number  2
generating number  3
printer shows-----  1
printer shows-----  4
sent squar of number  4
recieved number  3
sent squar of number  9
printer shows-----  9
generated number  3
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
        /Users/siyaram/go/src/github.com/SrmHitter9062/go-pipeline/main.go:15 +0x127

goroutine 19 [chan receive]:

我希望它在频道被划分时运行。这让我想到一个问题,我们是否需要每次都关闭频道,当我们完成它们时?

请有人帮助澄清为什么程序没有按预期运行。

【问题讨论】:

  • 这不是强制性的,因为该语言使您可以编写其他类型的退出条件,但是,这是每个人都可以理解并为特定目的设计的语言的强大功能。它旨在帮助您。
  • 鉴于提供的代码,预计会出现死锁。

标签: go pipeline channels


【解决方案1】:

你可以做任何你想做的事,但是在频道关闭之前,range 循环不会退出频道。

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多