如何回复频道的发送者和管理状态

How to reply to the sender of a channel and manage state

我想知道如何在 Go 中直接回复频道的发件人。更有趣的是如何识别发件人以备后用。

我将其与 Elixir GenServer 进行比较,我可以在 Elixir GenServer 中直接回复发件人或向所有人广播。 Go 中缺少此功能吗?

我到处阅读有关 Go 中的频道的信息,但我找不到如何执行此操作。

此外,Elixir 中的 GenServers 保持状态变为无限 运行 进程。 Go 是否有类似于 hold 和 pass 状态的东西?如果不是,这是如何实现的?

正在与频道发送者通信

如前所述,channel of channels 是一种直接回复频道发送者的方式。这是一个例子:

package main

func main() {
    // Make a communication channel by creating a channel of channels
    c := make(chan chan struct{})
    // Start a sender with the communication channel
    go sender(c)
    // Receive a message from the sender, in this case the message is a channel itself
    r := <- c
    // Send response to the sender on the channel given to us by the sender
    r <- struct{}{}
}

func sender(c chan chan struct{}) {
    // Create a channel the receiver will use to respond to us
    r := make(chan struct{})
    // Send the channel to the receiver
    c <- r
    // This is the response received after the received got the message
    <- r
}

关于您关于识别特定发件人的第二个问题,您可以使用 goroutinemap 之类的东西,它允许您管理命名 go-routines 的生命周期。然而,这种模式并不常见,如果您需要识别特定的频道发送者,您可以(并且应该)重新设计您的解决方案。

管理应用程序状态

这完全取决于您的应用程序及其作用。编辑:根据 OP,该应用程序是基于 websockets 的国际象棋游戏。您可以考虑创建一个数据结构,引用玩家的 websocket 连接以及玩家之间的游戏状态。该数据结构将在游戏开始时创建,然后该数据结构可以管理玩家之间来回的消息以及内部游戏状态的更新。也许像

type GameState struct {
    Player1 *websocket.Conn
    Player2 *websocket.Conn
    // Add any game state needed here
}

func (s *GameState) run(ctx context.Context) {
    // Send messages between websocket connections here and update game state accordingly
}