鉴于我有一片类型为User的结构

Users := make([]User)

我正在监听TCP连接,并且当用户连接时,我正在向该片中添加新用户。

我这样做的方法是建立一个NewUsers channel
NewUsers := make(chan User)

在新的TCP连接之后,用户将被发送到该 channel ,并且中央功能等待用户到达以将其添加到用户片中。

但是现在我希望多个子系统(包/功能)使用此用户列表。一个功能可能只是想接收用户列表,而另一个功能可能想向每个用户或仅满足特定条件的用户广播消息。

多个功能(可能从不同的goroutine执行)如何安全地访问用户列表。我看到两种可能的方式:
  • 每个需要访问此列表的子系统都需要有自己的AddUser channel 并维护自己的用户范围,并且需要向这些 channel 中的每个 channel 广播新用户。
  • 使用Mutex
  • 阻止访问

    选项1看起来非常复杂,会产生很多重复,但是我的理解是,如果您尝试坚持“通过通信共享内存”的口号,则最好避免使用Mutex。

    最佳答案

    互斥方法是解决该问题的最佳,最安全,最易管理的方法,并且是最快的。

    channel 内部是复杂的野兽,比rwmutex保护的 map /slice 慢得多。

    关于go - 在一些不同的goroutine中共享 slice ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38288459/

    10-16 07:06