2 回答
TA贡献1776条经验 获得超12个赞
因为监听器只需要写,而发送者只需要读——这是使用通道进行通信的一个很好的例子。流程如下所示:
侦听器会将新客户端发布到频道。
发件人将接收新客户端并将更新其本地客户端切片。
这样会更干净、更安全——因为监听器将无法“意外”读取,而发送者将无法“意外”写入。侦听器也可以关闭通道以向发送者指示它已完成。
TA贡献1820条经验 获得超10个赞
切片看起来适合该场景,但需要一个互斥锁来防止并发读取和写入切片。
让我们将 slice 和 mutex 捆绑在一个结构中,并为这两个操作添加方法:添加和枚举。
type clients struct {
mu sync.Mutex
values []*net.UDPAddr
}
// add adds a new client
func (c *clients) add(value *net.UDPAddr) {
c.mu.Lock()
c.values = append(c.values, value)
c.mu.Unlock()
}
// do calls fn for each client
func (c *clients) do(fn func(*net.UDPAddr) error) error {
c.mu.Lock()
defer c.mu.Unlock()
for _, value := range c.values {
if err := fn(value); err != nil {
return err
}
}
return nil
}
像这样使用它:
func listener(addr *net.UDPAddr, clients *clients, messages chan clientMessage) {
for {
clients.add(otherAddr)
}
}
func sender(messages chan clientMessage, clients *clients) {
for {
message := <-messages
clients.do(func(client *net.UDPAddr) error {
fmt.Printf("Message %s sent to %s\n", message.message, client.String())
return nil
})
}
}
func main() {
var clients clients
go listener(s, &clients, messageCh)
go sender(messageCh, &clients)
}
- 2 回答
- 0 关注
- 99 浏览
添加回答
举报