草庐IT

phoenix-channels

全部标签

go - 如何将 channel slice 作为可变参数传递给函数?

如果我有一个需要多个只读channel的函数(例如用于channel聚合),为什么我不能用一部分channel调用这个函数,比如packagemainfuncf(in...似乎我遗漏了一些基本的东西,但我不知道是什么。如果函数不能采用单向channel,为什么在第一种情况下不能采用单向channel? 最佳答案 好的,看来它与lack有关的slicecovarianceingo.我的解决方案是将“非定向”channelslice转换为只读channelslice。完整示例如下:packagemainimport("fmt""time

go - 在 Golang 中只有一条消息被不同地方的 channel 阻塞?

我正在尝试创建一个channel,用于确保一切就绪,所以我可以继续这个过程,一个例子是这样的:playgroundpackagemainimport("fmt")//donesendsthechannela"okay"status.funcdone(okchan这是输出:fatalerror:allgoroutinesareasleep-deadlock!goroutine1[chanreceive]:main.main()/tmp/sandbox709143808/main.go:29+0xc0我异常(exception)地发送ok一次,然后我可以在多个地方使用它,并得到这样的输出:

Go:转换后的 channel

假设我在Go中有一个intchannel:theint:=make(chanint)我想将这个channel包装在一个名为incremented的新channel中incremented:=make(chanint)这样:gofunc(){theint可以假定appended是唯一从int中读取的。如果在后台运行一个goroutine,它就会工作gofunc(){fornum:=rangetheint{incremented但是,我更喜欢在没有goroutine的情况下这样做,因为我无法在我的上下文中控制它。有没有更简单的方法呢?想到的一件事是python的yield:fornumin

go - 整数 channel slice

我想创建一个包含整数的channelslice。test:=make(chan[]int)test这是我初始化它的方式,但我不知道现在如何传递一个值,因为对于slice我们将使用append但对于channel我们使用发送数据我已经尝试过同时使用test 最佳答案 您定义了一个[]intchannel,但正试图向它发送一个int。您必须向它发送一个整数片段,然后让接收者使用该片段。这里是一个工作示例:https://play.golang.org/p/TmcUKU8G-1请注意,我将4附加到thingsslice而不是channel

Golang range through channel 在实现堆排列算法时具有奇怪的行为

我正在尝试实现Heap'sAlgorithm在去使用channel。当仅在屏幕上打印slice时,下面的代码工作正常,但是当使用channel将数组传递到主函数上的for/range循环时,会发生一些意外行为,并且slice/数组以口是心非的方式打印,并且并非所有排列都是发送。我想也许我在主要功能能够打印结果之前关闭channel,但我不希望双重打印。为什么会发生这种情况,我该如何让它发挥作用。packagemainimport"fmt"funcperm(a[]int64){varn=len(a)varc=make([]int,n)fmt.Println(a)i:=0fori

go - 当匿名函数在 golang 中永远等待 channel 时会发生什么?

我有一个函数可以创建一个没有缓冲区的channel。此函数继续创建其他几个写入所述channel的并发匿名函数。然后该函数继续等待channel上的输入,然后返回值。见下面的例子packagemainimport("time""fmt""strconv""math/rand")funcmain(){for{text:=foo()fmt.Println(text)time.Sleep(time.Second)}}funcfoo()string{ch:=make(chanstring)fori:=0;i即使整个函数(例如foo)“已死”,仍在channel上等待的匿名函数会发生什么情况?它

go - 如何等待 2 个 channel 并在它们都准备好读取时继续

假设我有2个缓冲channel,我如何等待它们,并且只有在两个channel中至少有一个项目时才继续?这就像组装一台由两个零件组成的机器,只有当两个零件都在手边时,我才能继续工作。Bothqueueareempty,wait.-------------------||||QUEUEA--------------------------------------||||QUEUEB-------------------QueueAhasoneelementbutQueueBempty,wait-------------------|||X|QUEUEA-------------------

input - Go - 如何知道输出 channel 何时完成

我尝试按照RobPike在“并发不是并行”演讲中的例子做了如下事情:作为从输入channel读取数据、执行一些处理然后通过输出channel发送结果的工作人员,我正在启动许多go例程。然后我启动另一个go例程,从某个来源读取数据并通过他们的输入channel将其发送给工作人员。最后,我想遍历输出channel中的所有结果并对它们进行处理。问题是因为工作在工作人员之间分配,我不知道所有工作人员何时完成,所以我可以停止向输出channel询问更多结果,我的程序可以正常结束。了解工作人员何时将结果发送到输出channel的最佳做法是什么? 最佳答案

go - 来自不同 channel 的数据进入 select 语句可以被忽略吗?

如果没有在select语句中的正确时刻捕获通过golang中的channel传入的数据,是否有可能被忽略?例如,假设有这个选择语句:for{select{case如果计时器在blockB运行时结束,blockA是否仍在循环的下一次迭代中运行,或者channel的传入数据是否丢失? 最佳答案 当定时器超时时,它会发送C上的当前时间。如果此时没有人正在从C读取,发送会阻塞,所以它会一直等到值被接收。在这种情况下,它将等到循环的下一次迭代。channel被设计成一种同步机制,因此它们不需要读者和作者已经同步。

go - 通过 channel 发送数据卡住

我正在编写一个使用长轮询的服务器,基本上我有一个定期运行并通过channel发送响应的go例程。然而,程序在尝试发送到channel时卡住了。我做了一个简单的程序来演示这个问题:packagemainimport("log""time")varrespchanstringfuncmain(){gosend()listen()}funclisten(){select{caseresponse:=有人知道问题出在哪里吗?谢谢 最佳答案 使用前必须先创建channelvarresp=make(chanstring)