我正在運行一個 websocket 客戶端,并希望將響應從客戶端傳遞到我可以在我的主文件中使用的通道。目前,通道只返回一次 nil 值,然后就沒有別的了。將值傳遞給頻道時,我似乎遇到了問題。有什么幫助嗎?這是我到目前為止所做的package mainimport ( "context" "fmt" "kraken_client/stored_data" "kraken_client/ws_client" "os" "os/signal" "strings" "sync" "syscall")func main() { // check if in production or testing mode & find base curency var testing bool = true args := os.Args isTesting(args, &testing, &stored_data.Base_currency) // go routine handler comms := make(chan os.Signal, 1) signal.Notify(comms, os.Interrupt, syscall.SIGTERM) ctx := context.Background() ctx, cancel := context.WithCancel(ctx) var wg sync.WaitGroup // set ohlc interval and pairs OHLCinterval := 5 pairs := []string{"BTC/" + stored_data.Base_currency, "EOS/" + stored_data.Base_currency} // create ws connections pubSocket, err := ws_client.ConnectToServer("public", testing) if err != nil { fmt.Println(err) os.Exit(1) } // listen to websocket connections ch := make(chan interface{}) wg.Add(1) go pubSocket.PubListen(ctx, &wg, ch, testing) // subscribe to a stream pubSocket.SubscribeToOHLC(pairs, OHLCinterval) go func() { for c := range ch { fmt.Println(c) } }() <-comms cancel() wg.Wait() defer close(ch)}下面是 PubListen 函數的工作原理func (socket *Socket) PubListen(ctx context.Context, wg *sync.WaitGroup, ch chan interface{}, testing bool) { defer wg.Done() defer socket.Close() var res interface{} socket.OnTextMessage = func(message string, socket Socket) { //log.Println(message) res = pubJsonDecoder(message, testing) // this function decodes the message and returns an interface log.Println(res) // this is printing the correctly decoded value. } ch <- res log.Println(res) // does not print a value log.Println(ch) // does not print a value <-ctx.Done() log.Println("closing public socket") return}我究竟做錯了什么?
1 回答

九州編程
TA貢獻1785條經驗 獲得超4個贊
問題中的代碼在由 OnTextMessage 函數設置之前執行ch <- res一次語句。PubListenres
要ch在每條消息上發送一個值,請將行ch <- res移至 OnTextMessage 函數。該函數為每條消息調用一次。
func (socket *Socket) PubListen(ctx context.Context, wg *sync.WaitGroup, ch chan interface{}, testing bool) {
defer wg.Done()
defer socket.Close()
socket.OnTextMessage = func(message string, socket Socket) {
res := pubJsonDecoder(message, testing)
ch <- res
log.Println(res)
}
<-ctx.Done()
log.Println("closing public socket")
return
}
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報
0/150
提交
取消