通过go通道传输数据

通过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)

我正在尝试构建一个函数,我将一个通道传递给它,当在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)
        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
无需进一步更新,请用相关代码发布一个新问题。根据我对您评论的理解,您正在寻找取消模式,但如果没有适当的代码来反对,同样很难找出它。