簡體   English   中英

在select中的同一通道上讀寫

[英]Read and write on the same channel in select

這樣可以使用一個通道在兩個例程之間交換數據嗎?

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)

可以工作 ,但通常是個壞主意(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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM