golang 的channel配合select使用的意义

sysummery
  • 636

我不大明白下面两种写法在go里面有什么不同

func MySelect() {
    ch := make(chan int, 10)

    a := <-ch
    fmt.Println(a)
}
func MySelect() {
    ch := make(chan int, 10)

    select {
    case a := <-ch:
        fmt.Println(a)
    }
}

第二种使用了select使用有什么好处呢?

回复
阅读 619
2 个回答

就你写的这两个示例,运行上没有区别

考虑下面的情况:
1、如果 ch 持续不断有数据写入,要如何读取?(很明显需要使用 for 循环)如下:

func MySelect(ch chan int) {
    for {
        a := <-ch
        fmt.Println(a)
    }
}

2、如果 MySelect() 要多读取并处理另一个持续不断写入数据的 channel 呢?下面的代码是否可以实现?

func MySelect(ch chan int, ch2 chan int) {
    for {
        a := <-ch
        fmt.Println(a)
    
        b := <-ch2
        fmt.Println(b)
    }
}

很明显不行,因为 a := <-ch 可能会阻塞后面的代码执行。这时候就要用到 select 了,如下:

func MySelect(ch chan int, ch2 chan int) {
    for {
        select {
        case a := <-ch:
            fmt.Println(a)
        case b := <-ch2:
            fmt.Println(b)
        }
    }
}

chch2 无论哪个先有数据被读取到都不会产生阻塞

大概就是这个意思

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏