【问题标题】:Read and write on the same channel in select在select中的同一通道上读写
【发布时间】:2019-02-17 00:16:53
【问题描述】:

以这种方式使用一个通道在两个例程之间交换数据是否可以?

c := make(chan int)

go func() {
    var i int
    select {
    case c<- 1:
        i = <-c
    case i = <-c:
        c<- 1
    }
    fmt.Println(" A - Written 1 red ", i)
}()

var i int
select {
case c<- 2:
    i = <-c
case i = <-c:
    c<- 2
}
fmt.Println(" B - Written 2 red ", i)

【问题讨论】:

    标签: go channel


    【解决方案1】:

    works,但通常是个坏主意(tm)

    你未来的软件维护者会因此而恨你

    注意,如果这些循环不完全相同,那么当主 goroutine 由于没有其他人写入或读取而阻塞时,应用程序将崩溃

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        c := make(chan int)
    
        go func() {
            for x := 0; x < 5; x++ {
                var i int
                select {
                case c <- 1:
                    i = <-c
                case i = <-c:
                    c <- 1
                }
                fmt.Println(" A - Written 1 red ", i)
            }
        }()
        for x := 0; x < 5; x++ {
            var i int
            select {
            case c <- 2:
                i = <-c
            case i = <-c:
                c <- 2
            }
            fmt.Println(" B - Written 2 red ", i)
        }
    }
    

    输出:

     B - Written 2 red  1
     A - Written 1 red  2
     B - Written 2 red  1
     A - Written 1 red  2
     B - Written 2 red  1
     A - Written 1 red  2
     B - Written 2 red  1
     A - Written 1 red  2
     B - Written 2 red  1
    
    Program exited.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2013-01-29
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多