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

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

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

Go
LEATH 2023-06-05 19:37:40
这样使用一个通道在两个例程之间交换数据是否可以?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 intselect {case c<- 2:    i = <-ccase i = <-c:    c<- 2}fmt.Println(" B - Written 2 red ", i)
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

它有效,但通常是个坏主意(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.


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

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