Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang中多个发送方到单通道_Go_Concurrency_Channels - Fatal编程技术网

Golang中多个发送方到单通道

Golang中多个发送方到单通道,go,concurrency,channels,Go,Concurrency,Channels,这个概念似乎很容易解释,但更难实现(“正确”) tl;dr是我想运行多个函数,将输出推送到一个通道中 作为一个样本工作测试(多渠道),来详细说明我的问题 然而,我希望实现以下目标: 输出: Adding inside: C Adding inside: A Adding inside: B ..snip.. Adding inside: C Adding inside: C Adding inside: C [{0 0} {1 0} {2 0} {3 0} {4 0} {5 0} {6 0} {

这个概念似乎很容易解释,但更难实现(“正确”)

tl;dr是我想运行多个函数,将输出推送到一个通道中

作为一个样本工作测试(多渠道),来详细说明我的问题

然而,我希望实现以下目标: 输出:

Adding inside: C
Adding inside: A
Adding inside: B
..snip..
Adding inside: C
Adding inside: C
Adding inside: C
[{0 0} {1 0} {2 0} {3 0} {4 0} {5 0} {6 0} {7 0} {8 0} {9 0} {10 0} {11 0} {12 0} {13 0} {14 0} {15 0} {16 0} {17 0} {18 0} {19 0} {20 0} {21 0} {22 0} {23 0} {24 0} {25 0} {26 0} {27 0} {28 0} {29 0}]
Adding inside: C
Adding inside: A
Adding inside: B
..snip
Adding inside: B
Adding inside: A
Adding inside: C
[{0 0} {1 0} {2 0} {3 0} {4 0} {5 0} {6 0} {7 0} {8 0} {9 0}]
但如图所示,函数modify2和modify3在视觉上似乎从未添加过

这是可能的,还是顶部样本更可行

我想实现这样的目标

这是可能的,还是顶部样本更可行

是的:您可以跨多个goroutine使用单个通道——这就是通道的设计目的

但如图所示,函数modify2和modify3在视觉上似乎从未添加过

您遇到的问题是,您只呼叫了接收操作员一次:

b := append(<-channelA)
fmt.Println(b)
哪些产出:

Adding inside: C
Adding inside: A
Adding inside: B
Adding inside: A
Adding inside: A
Adding inside: B
Adding inside: C
Adding inside: A
Adding inside: B
Adding inside: A
Adding inside: A
Adding inside: B
Adding inside: C
Adding inside: A
Adding inside: A
Adding inside: B
Adding inside: A
Adding inside: C
Adding inside: A
Adding inside: B
[{0 0} {1 0} {2 0} {3 0} {4 0} {5 0} {6 0} {7 0} {8 0} {9 0}]
Adding inside: C
Adding inside: B
Adding inside: B
Adding inside: C
Adding inside: B
Adding inside: C
Adding inside: B
[{10 0} {11 0} {12 0} {13 0} {14 0} {15 0} {16 0} {17 0} {18 0} {19 0}]
Adding inside: C
Adding inside: C
Adding inside: C
[{20 0} {21 0} {22 0} {23 0} {24 0} {25 0} {26 0} {27 0} {28 0} {29 0}]
然后,您可以更改该代码,在输出之前将接收到的元素附加到单个列表中,或者以您喜欢的任何方式格式化接收到的元素

我觉得这就像是突然跳到一堆东西上,然后拉整个东西


对于初始化的、未关闭的缓冲通道,send语句将一个元素放入队列,而receive操作将一个元素从队列中弹出并返回它。它是先进先出(FIFO)顺序,因此它是一个队列而不是一个堆栈。在上面的示例中,通道是无缓冲的,因此发送必须等待goroutine准备好接收,而接收必须等待goroutine准备好发送。Main也是一个goroutine。

如果你想让它们都推到同一个频道,为什么不让它们都推到播放链接中的同一个频道?在第二个示例中,你的问题是你只从频道接收一次,这意味着只有第一个发送到该频道的发送者(在本例中,a,尽管在技术上是不确定的)收到。如果您需要所有3个通道的输出,您需要从通道接收3次才能获得所有输出(发送到通道并不仅仅是神奇地连接所有这些值!)是否要等到所有例程完成后再打印结果?太棒了,我想我可能误解了阻塞/发送的概念,根据我的大脑,通过发送到频道,它将在围棋程序完成后全部被拉出,几乎就像弹出一个堆栈,然后拉动整个堆栈。但我现在明白了,我必须“一推一拉”。非常感谢大家:)play.golang.org/p//u v1r\u cq5g因为Body.Close()似乎没有结束围棋程序。谢谢你们的回答,我理解你们给出的概念/设计。。。我对阻塞/发送的理解有点偏颇,我认为这几乎就像是在堆栈上弹出,然后拉动整个堆栈。这种方法是100%有效的,但一旦应用到与HTTP相关的函数中,它似乎就挂起了,下面是我所说的示例:Body.Close()不关闭go例程。为什么response.Body.close()会关闭goroutine?您在注释中链接的代码包含无限for{…}循环。看起来只有在出现错误时才调用
os.Exit
。所以我不明白为什么你的程序不能永远运行。你链接的代码是不同的代码,有不同的问题。如果你需要更多的帮助,我建议你把它作为一个新问题发布。
b := append(<-channelA)
fmt.Println(b)
func main() {
    ch := make(chan []intTest)

    go modify1("A", ch)
    go modify2("B", ch)
    go modify3("C", ch)
    fmt.Println(<-ch)
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}
Adding inside: C
Adding inside: A
Adding inside: B
Adding inside: A
Adding inside: A
Adding inside: B
Adding inside: C
Adding inside: A
Adding inside: B
Adding inside: A
Adding inside: A
Adding inside: B
Adding inside: C
Adding inside: A
Adding inside: A
Adding inside: B
Adding inside: A
Adding inside: C
Adding inside: A
Adding inside: B
[{0 0} {1 0} {2 0} {3 0} {4 0} {5 0} {6 0} {7 0} {8 0} {9 0}]
Adding inside: C
Adding inside: B
Adding inside: B
Adding inside: C
Adding inside: B
Adding inside: C
Adding inside: B
[{10 0} {11 0} {12 0} {13 0} {14 0} {15 0} {16 0} {17 0} {18 0} {19 0}]
Adding inside: C
Adding inside: C
Adding inside: C
[{20 0} {21 0} {22 0} {23 0} {24 0} {25 0} {26 0} {27 0} {28 0} {29 0}]