为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中使用 select 发送到频道有什么好处?

在 Go 中使用 select 发送到频道有什么好处?

Go
慕丝7291255 2021-11-08 16:55:05
在 Gorilla websocket 的示例目录中有一个名为 hub.go 的文件。https://github.com/gorilla/websocket/blob/master/examples/chat/hub.go在这里,您可以在类型集线器上找到执行此操作的方法。func (h *hub) run() {    for {        select {        case c := <-h.register:            h.connections[c] = true        case c := <-h.unregister:            if _, ok := h.connections[c]; ok {                delete(h.connections, c)                close(c.send)            }        case m := <-h.broadcast:            for c := range h.connections {                select {                case c.send <- m:                default:                    close(c.send)                    delete(h.connections, c)                }            }        }    }}为什么在最后一种情况下它不直接发送到 c.send 通道?case m := <-h.broadcast:    for c := range h.connections {        c.send <- m    }
查看完整描述

2 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

它是保证非阻塞发送到通道的方法。如果 c.send chan 现在不能接受新消息,将执行一个默认分支。如果没有 select{} 块发送到未缓冲或完全填充的缓冲通道,则可以被阻止。


查看完整回答
反对 回复 2021-11-08
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

https://gobyexample.com/non-blocking-channel-operations


// Basic sends and receives on channels are blocking.

// However, we can use `select` with a `default` clause to

// implement _non-blocking_ sends, receives, and even

// non-blocking multi-way `select`s.


package main


import "fmt"


func main() {

    messages := make(chan string)

    //[...]


    // Here's a non-blocking receive. If a value is

    // available on `messages` then `select` will take

    // the `<-messages` `case` with that value. If not

    // it will immediately take the `default` case.

    select {

    case msg := <-messages:

        fmt.Println("received message", msg)

    default:

        fmt.Println("no message received")

    }


    // A non-blocking send works similarly.

    msg := "hi"

    select {

    case messages <- msg:

        fmt.Println("sent message", msg)

    default:

        fmt.Println("no message sent")

    }

    //[...]

}

更明确地说:对于非阻塞“发送”,case如果有接收者已经在等待消息,则第一个将发生。否则它会回落到default


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信