为了账号安全,请及时绑定邮箱和手机立即绑定

如何在同一结构中使用多个通道

如何在同一结构中使用多个通道

Go
阿晨1998 2023-01-03 14:08:02
在我的代码中,我想执行以下操作:从输入接收数据event和message根据接收到的数据格式化event我想使用与 OOP 中的方法接近的东西,但看起来我搞砸了。我写的是:// Define the structs that contains the channelstype sseData struct {    event, message string}type DataPasser struct {    data       chan sseData    logs       chan string    connection chan struct{} // To control maximum allowed clients connections}// DEfine the struct's reciever that do the formating based on the input datefunc (p *DataPasser) Format() {    data := <-p.data    switch {    case len(data.event) > 0:        p.logs <- fmt.Sprintf("event: %v\ndata: %v\n\n", data.event, data.message)    case len(data.event) == 0:        p.logs <- fmt.Sprintf("data: %v\n\n", data.message)    }}然后我有以下内容:func (p *DataPasser) HandleSignal(w http.ResponseWriter, r *http.Request) {    w.Header().Set("Content-Type", "text/event-stream; charset=utf-8")    w.Header().Set("Cache-Control", "no-cache")    w.Header().Set("Connection", "keep-alive")    setupCORS(&w, r)    fmt.Println("Client connected from IP:", r.RemoteAddr)    p.connection <- struct{}{}    flusher, ok := w.(http.Flusher)    if !ok {        http.Error(w, "Internal error", 500)        return    }    fmt.Fprint(w, "event: notification\ndata: Connection to WhatsApp server ...\n\n")    flusher.Flush()    // Connect to the WhatsApp client    go Connect()    // Prepare dataParser `p` to recieve data through its sseData channel    go p.Format()    for {        select {        case c := <-p.logs:            fmt.Fprint(w, c)            flusher.Flush()        case <-r.Context().Done():            <-p.connection            fmt.Println("Connection closed")            return        }    }}
查看完整描述

2 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

当您passer.datago connect()例程向其发送数据时,例程go p.Format()不在监听。因为您使用的是无缓冲通道parser.data但没有接收器正在监听,所以您的代码被卡住了。要么使用缓冲通道,parser.data要么确保您的例程监听来自数据通道的传入消息已启动,并在实际将数据发送到通道之前进行监听。在你的情况下,我想在Format例程之前开始例程Connect就足够了。



查看完整回答
反对 回复 2023-01-03
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

我通过写解决了它:


    // Connect to the WhatsApp client

    go Connect()


    for {

        select {

        case data := <-p.data:

            fmt.Println("recieved")


            switch {

            case len(data.event) > 0:

                fmt.Fprintf(w, "event: %v\ndata: %v\n\n", data.event, data.message)

            case len(data.event) == 0:

                fmt.Fprintf(w, "data: %v\n\n", data.message)

            }

            flusher.Flush()

        case <-r.Context().Done():

            <-p.connection

            fmt.Println("Connection closed")

            return

        }

    }

但我仍然对拆分操作和使用接收器感兴趣,我不能接受这个作为答案,因为它是问题的解决方案,但不是问题的答案。任何想法?


查看完整回答
反对 回复 2023-01-03
  • 2 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信