首页 > 解决方案 > 无法在 go 例程中获取多个通道值

问题描述

我已经编写了 2 个用于 Web 套接字读取和写入消息的 goroutine。例如,

ch := make(chan bool)
folderName := make(chan string)

go func(co *websocket.Conn) {
    m, d, err := co.ReadMessage()
    fmt.Println(m, string(d), err)

    folderName <- string(d)
    ch <- true

    if string(d) == "closed" {
        ch <- true
        co.Close()
    }
}(conn)

该 goroutine 用于从套接字读取消息并更新通道。

go func(co *websocket.Conn) {
    value := <-ch
    fldr := <-folderName

    fmt.Println(fldr, value)
}(conn)

这个 goroutine 用于编写消息。但我无法获得 folderName 和 ch 频道值。我不知道如何找到问题。

如果我通过单通道,我可以从通道中获取消息。但我需要在那个 goroutine 中获得 2 个值。

任何人都可以帮助解决这些问题吗?提前致谢。

标签: gochannel

解决方案


在您的情况下,由于您从那里读取单个消息,因此websocket.Connection您需要更改从通道读取的顺序,因为您的通道没有缓冲,只要没有消费者,您的写入就会被阻止,反之亦然。在您的情况下,您在第一个 goroutine 中写入folderName通道,然后从另一个通道读取,ch因此您的两个 goroutine 都将被阻塞。

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan bool)
    folderName := make(chan string)

    go func() {
        ch <- true
        folderName <- "Some text"

        .
                .
                .
    }()

    go func() {
        value := <-ch
        fldr := <-folderName

        fmt.Println(fldr, value)
    }()

    time.Sleep(time.Second)
}

游乐场示例


推荐阅读