通过go通道传输数据
我正在尝试构建一个函数,我将一个通道传递给它,当在go例程中运行时,它将不断地向通道发布更新(在本例中为sin值)。当数据被发送到通道时,我想通过web套接字发送它通过go通道传输数据,go,Go,我正在尝试构建一个函数,我将一个通道传递给它,当在go例程中运行时,它将不断地向通道发布更新(在本例中为sin值)。当数据被发送到通道时,我想通过web套接字发送它 func sineWave(value chan float64) { var div float64 sinMult := 6.2839 i := 0 log.Println("started") for { div = (float64(i+1) / sinMult)
func sineWave(value chan float64) {
var div float64
sinMult := 6.2839
i := 0
log.Println("started")
for {
div = (float64(i+1) / sinMult)
log.Println(math.Sin(div))
time.Sleep(100 * time.Millisecond)
value <- math.Sin(div)
// log.Println()
i++
if i == 45 {
i = 0
}
}
// log.Println(math.Sin(div * math.Pi))
}
func正弦波(值64){
var div浮动64
sinMult:=6.2839
i:=0
log.Println(“已启动”)
为了{
div=(浮动64(i+1)/sinMult)
log.Println(math.Sin(div))
时间。睡眠(100*时间。毫秒)
值此代码中有几个错误
- 值chan永远不会耗尽,因此任何写入操作都将阻塞
- 值chan从未关闭,因此任何排水都将是无限的
渠道必须始终排水,渠道必须在某个点关闭
此外,请张贴可复制的示例,否则很难诊断问题
这是一个稍加修改但仍能正常工作的操作代码版本
package main
import (
"fmt"
"math"
"time"
)
func sineWave(value chan float64) {
defer close(value) // A channel must always be closed by the writer.
var div float64
sinMult := 6.2839
i := 0
fmt.Println("started")
for {
div = (float64(i+1) / sinMult)
time.Sleep(100 * time.Millisecond)
value <- math.Sin(div)
i++
if i == 4 {
// i = 0 // commented in order to quit the loop, thus close the channel, thus end the main for loop
break
}
}
}
func main() {
value := make(chan float64)
go sineWave(value) // start writing the values in a different routine
// drain the channel, it will end the loop whe nthe channel is closed
for v := range value {
fmt.Println(v)
}
}
主程序包
进口(
“fmt”
“数学”
“时间”
)
func正弦波(值64){
延迟关闭(值)//写入程序必须始终关闭通道。
var div浮动64
sinMult:=6.2839
i:=0
fmt.Println(“已启动”)
为了{
div=(浮动64(i+1)/sinMult)
时间。睡眠(100*时间。毫秒)
值使用goroutine?您只显示了逻辑的“接收方”端,必须有“发送方”端,另一个goroutine在value
频道上发送值,否则从它接收将被阻止。我以为这就是“发送方”。最初,我在chan上有一个for循环,用于打印输出,但我不完全确定如何在@izcaThanks上执行此操作并理解要点。我现在遇到的问题是,如果我在应用程序中遇到另一个中断,如何保持更新流。例如,我的主函数以log.Fatal(http.ListenAndServe(:3000)结束(路由器)
因此,具有上述代码的输出是0.1584660163832 0.31292741197327933 0.45948077900493006 0.594422545163891 2018/09/18 21:26:31服务器正在运行http://localhost:3000
无需进一步更新,请用相关代码发布一个新问题。根据我对您评论的理解,您正在寻找取消模式,但如果没有适当的代码来反对,同样很难找出它。