在选择中的同一通道上读写

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


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)


LEATH
浏览 88回答 1
1回答

开心每一天1111

它有效,但通常是个坏主意(tm)你未来的软件维护者会因此讨厌你请注意,如果这些循环不完全相同,那么当主 goroutine 由于没有其他人写入或读取而阻塞时,应用程序将崩溃package mainimport (    "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  1Program exited.
打开App,查看更多内容
随时随地看视频慕课网APP