登录
首页 >  Golang >  Go问答

在不同的 go 例程中读取/写入记录集 - 使用什么数据结构

来源:stackoverflow

时间:2024-02-24 21:51:26 453浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《在不同的 go 例程中读取/写入记录集 - 使用什么数据结构》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我有一个使用 2 个 go 例程的聊天应用程序。我想在一个线程中向列表中添加/删除记录,并从另一个线程中读取相同的列表。

由于我对 go 还很陌生,所以我对应该使用什么数据结构有点困惑。我想到了切片,但不确定我是否以正确的方式使用它

func listener(addr *net.UDPAddr, clients *[] *net.UDPAddr, messages chan clientMessage) {

    for {
            *clients=append(*clients,otherAddr)     
    }
}

func sender(messages chan clientMessage,clients *[] *net.UDPAddr) {

  for {
    message :=<- messages
    for _,client := range *clients {
            fmt.Printf("Message %s sent to %s\n", message.message, client.String())

    }
  }
}


func main() {   
    var clients [] *net.UDPAddr
    go listener(s,&clients,messageCh)
    go sender(messageCh,&clients) 
}

解决方案


由于监听者只需要写入,发送者只需要读取 - 这是使用通道进行通信的一个很好的例子。流程如下所示:

  1. 监听器会将新客户端发布到频道。
  2. 发送方将接收新客户端并更新其本地切片 客户数量。

这种方式会更加干净和安全 - 因为侦听器将无法“意外”读取,发送者将无法“意外”写入。侦听器还可以关闭通道以向发送者指示已完成。

切片对于该场景来说看起来没问题,但需要 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)
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>