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

go select语句中发送和接收操作之间的优先级规则

go select语句中发送和接收操作之间的优先级规则

Go
慕的地8271018 2022-11-15 17:11:31
go select 语句中发送和接收操作之间是否有优先级规则?由于“发送”操作始终准备就绪,不像“接收”操作等待来自通道的某些内容,我总感觉“发送”将首先在选择上执行。我尝试了一些代码来测试发送和接收都准备好时会发生什么:package mainimport (    "fmt"    "time")func main() {    ch1 := make(chan string)    ch2 := make(chan string)    go goOne(ch1)    go goTwo(ch2)    time.Sleep(time.Second * 2)    select {    case ch2 <- "To goTwo goroutine":    case msg1 := <-ch1:        fmt.Println(msg1)    }}func goOne(ch chan string) {    ch <- "From goOne goroutine"}func goTwo(ch chan string) {    msg := <-ch    fmt.Println(msg)}结果似乎总是“来自 goOne goroutine”。所以看起来接收操作具有优先级。但这是设计效果吗?还是会发生先执行发送的情况?我在文档中找不到信息如果我希望接收操作具有优先权,我可以依赖它还是应该做其他事情?
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

go select 语句中发送和接收操作之间是否有优先级规则?


不可以。当case同时准备好一个以上时,随机执行一个。


因为“发送”操作总是准备好的


不对。当另一侧没有接收任何内容或缓冲通道的缓冲区已满时,发送操作可能只是阻塞(即未准备好)。


还是会发生先执行发送的情况?


Yes, but you may see no output when this case is selected because your program resumes execution in main and exits immediately before the goTwogoroutine can actually print anything.


如果我希望接收操作具有优先级 [...]


select 语句的语义是:“执行先准备好的”。如果一种情况必须优先于另一种情况,请将另一种情况更改为default(如果没有其他准备就绪则运行):


    select {

    case msg1 := <-ch1:

        fmt.Println(msg1)

    default:

        ch2 <- "To goTwo goroutine"

    }


查看完整回答
反对 回复 2022-11-15
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号